mongodb是文档型数据库,使用BJSON(Binary JSON)格式存储数据,与JSON高度兼容
数据库(Database):存储数据的容器,类似关系型数据库的数据库
集合(Collection):数据库中的集合,相当于数据库中的表
文档(Document):数据记录,相当于关系型数据库中数据表的行(row),以BJSON格式存储
1.查看版本:db.version();
2.mongo --eval "db.version()" 或 mongod --version 或 systemctl status mongod
A:主版本号,重大更新时递增。B:次版本号,偶数为稳定版,奇数为开发版(如 4.4 为稳定版,4.5 为开发版)C:修订号,仅修复 bug,保持兼容性
标准连接库:mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
mongodb://:协议头,表示使用 MongoDB。
username:password@\]:(可选)认证信息,包括用户名和密码。
host1\[:port1\]\[,...hostN\[:portN\]\]:服务器地址和端口,可以是一个或多个 MongoDB 服务器的地址和端口。
/\[defaultauthdb\]:(可选)默认认证数据库。
\[?options\]:(可选)连接选项。
---------------
标准的连接格式包含了多个选项(options),如下所示:
authSource:指定认证数据库。
replicaSet:指定副本集的名称。
ssl:启用 SSL 连接(true 或 false)。
readPreference:指定读偏好,如 primary, primaryPreferred, secondary, secondaryPreferred, nearest。
connectTimeoutMS:指定连接超时时间(毫秒)。
socketTimeoutMS:指定套接字超时时间(毫秒)
=====
连接到本地:mongodb://localhost
连接到本地指定数据库:mongodb://localhost/mydatabase
使用用户名和密码连接到本地 MongoDB 实例:mongodb://username:password@localhost/mydatabase
连接到远程 MongoDB 实例:mongodb://remotehost:27017
连接到副本集(Replica Set):mongodb://host1:27017,host2:27017,host3:27017/mydatabase?replicaSet=myReplicaSet
使用 SSL 连接到 MongoDB:
mongodb://username:password@localhost:27017/mydatabase?ssl=true
使用多个选项连接:
mongodb://username:password@localhost:27017/mydatabase?authSource=admin\&ssl=true
--------------
###php连接:
require 'vendor/autoload.php'; // 引入 Composer 自动加载文件
$client = new MongoDB\\Client("mongodb://localhost:27017"); // 连接到本地 MongoDB 实例
$database = $client-\>selectDatabase('mydatabase'); // 选择数据库
$collection = $database-\>selectCollection('mycollection'); // 选择集合
// 插入文档
$result = $collection-\>insertOne(\['name' =\> 'Alice', 'age' =\> 30\]);
echo "Inserted with Object ID '{$result-\>getInsertedId()}'";
// 查询文档
$document = $collection-\>findOne(\['name' =\> 'Alice'\]);
echo "Found document: " . json_encode($document);
###java连接
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
public class MongoDBConnection {
public static void main(String\[\] args) {
String uri = "mongodb://user:password@localhost:27017/mydatabase?authSource=admin";
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("mydatabase");
System.out.println("Connected to MongoDB");
}
}
}
--------------------------------
{"name":"lisi","age":30,"address":{"city":"beijing","point":""}}
1.连接数据库:mongosh --host \
});
2.3使用正则表达式进行模式匹配查询。
db.myCollection.find({ name: /^A/ });
2.4投影用于控制查询结果中返回的字段。可以使用包含字段和排除字段两种方式
db.dbTable.find(
{ age: { $gt: 25 } },
{ name: 1, age: 1, _id: 0 }
);
2.5对查询结果进行排序-按年龄降序排序:
db.dbTable.find().sort({ age: -1 });
2.6对查询结果进行限制和跳过指定数量的文档
db.dbTable.find().limit(10);
跳过前 5 个文档,返回接下来的 10 个文档:
db.myCollection.find().skip(5).limit(10);
eg:
db.myCollection.find(
{
$and: [
{ age: { $gt: 25 } },
{ city: "New York" }
]
},
{ name: 1, age: 1, _id: 0 }
).sort({ age: -1 }).limit(10);
###创建索引
******************
注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。
db.collection.createIndex( keys, options )
db:数据库的引用。
collection:集合的名称。
keys:一个对象,指定了字段名和索引的排序方向(1 表示升序,-1 表示降序)。
options:一个可选参数,可以包含索引的额外选项。
options 参数是一个对象,可以包含多种配置选项,以下是一些常用的选项:
unique:如果设置为 true,则创建唯一索引,确保索引字段的值在集合中是唯一的。
background:如果设置为 true,则索引创建过程在后台运行,不影响其他数据库操作。
name:指定索引的名称,如果不指定,MongoDB 会根据索引的字段自动生成一个名称。
sparse:如果设置为 true,创建稀疏索引,只索引那些包含索引字段的文档。
expireAfterSeconds:设置索引字段的过期时间,MongoDB 将自动删除过期的文档。
v:索引版本,通常不需要手动设置。
weights:为文本索引指定权重。
// 创建 age 字段的升序索引
db.myCollection.createIndex({ age: 1 });
// 创建 name 字段的文本索引
db.myCollection.createIndex({ name: "text" });
// 创建唯一索引
db.collection.createIndex( { field: 1 }, { unique: true } )
// 创建后台运行的索引
db.collection.createIndex( { field: 1 }, { background: true } )
// 创建稀疏索引
db.collection.createIndex( { field: 1 }, { sparse: true } )
// 创建文本索引并指定权重
db.collection.createIndex( { field: "text" }, { weights: { field: 10 } } )
创建地理空间索引
对于存储地理位置数据的字段,可以使用 2dsphere 或 2d 索引类型来创建地理空间索引。
// 2dsphere 索引,适用于球形地理数据
db.collection.createIndex( { location: "2dsphere" } )
// 2d 索引,适用于平面地理数据
db.collection.createIndex( { location: "2d" } )
###查看索引
db.collection.getIndexes()
###删除索引
// 删除指定的索引
db.collection.dropIndex( "indexName" )
// 删除所有索引
db.collection.dropIndexes()
索引策略
在创建索引时,需要考虑以下因素:
查询频率:优先考虑那些经常用于查询的字段。
字段基数:字段值的基数越高(即唯一值越多),索引的效果越好。
索引大小:索引的大小会影响数据库的内存占用和查询性能。
索引优化
在对索引进行优化时,可以考虑以下方法:
选择合适的索引类型:根据查询需求选择合适的索引类型。
创建复合索引:对于经常一起使用的字段,考虑创建复合索引以提高查询效率。
监控索引性能:定期监控索引的使用情况,根据实际需求调整索引。
注意事项
索引虽然可以提高查询性能,但也会增加写操作的开销。因此,在创建索引时需要权衡查询性能和写入性能。
索引会占用额外的存储空间,特别是对于大型数据集,需要考虑索引的存储成本。
**************
===
3.创建用户:
db.createUser({
user: "testuser",
pwd: "password",
roles: [
{role:"readWrite",db:"<database-name>"},
{role:"dbAdmin",db:"<database-name>"}
]
})
4.验证用户
db.auth("usertest","password")
5.启用身份验证,编辑mogod.conf(安全访问MongoDB)
security:
authorization:"enabled"
*重启mongodb
6.使用用户身份登录
mongosh --host <hostname> --port <port:27017> -u "usertest" -p "password" --authenticationDatabase "<database-name>"
7.删除用户db.dropUser("usertest")
#########MongoDB副本集设置
现在我们通过指定 --replSet 选项来启动mongoDB。--replSet 基本语法格式如下:
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
实例:mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
或:
添加副本集的成员,我们需要使用多台服务器来启动mongo服务。进入Mongo客户端,并使用rs.add()方法来添加副本集的成员rs.add() 命令基本语法格式如下:
>rs.add(HOST_NAME:PORT)
*MongoDB中你只能通过主节点将Mongo服务添加到副本集中, 判断当前运行的Mongo服务是否为主节点可以使用命令db.isMaster() 。
安装:
$ wget http://pecl.php.net/get/mongodb-1.5.2.tgz
$ cd /mongodb-1.5.2
$ phpize
$ ./configure
$ make && make install
或php自己编译的,则安装方法如下(假设是编译在 /usr/local/php目录中):
$ wget http://pecl.php.net/get/mongodb-1.5.2.tgz
$ cd /mongodb-1.5.2
$ /usr/local/php/bin/phpize
$ ./configure --with-php-config=/usr/local/php/bin/php-config
$ make && make install
安装成功后:installing shared extensions: /usr/lib/php/extensions/debug-non-zts-20151012/
在php.ini添加:
extension_dir=/usr/lib/php/extensions/debug-non-zts-20151012/
* extension_dir 配置项的路径:php -i | grep extension_dir
php代码:
$m = new MongoClient(); // 连接
db = m->test; // 获取名称为 "test" 的数据库
collection = db->createCollection("testdb");
echo "集合创建成功";
collection = db->testdb; // 选择集合
插入数据:
$document = array(
"title" => "MongoDB",
"description" => "database",
"likes" => 100,
"url" => "http://www.runoob.com/mongodb/",
"by", "菜鸟教程"
);
collection-\>insert(document);
echo "数据插入成功";
cursor = collection->find();
// 迭代显示文档标题
foreach (cursor as document) {
echo $document["title"] . "\n";
}
更新数据
collection-\>update(array("title"=\>"MongoDB"), array('set'=>array("title"=>"MongoDB 教程")));
// 显示更新后的文档
cursor = collection->find();
// 循环显示文档标题
foreach (cursor as document) {
echo $document["title"] . "\n";
}
删除数据
// 移除文档
$collection->remove(array("title"=>"MongoDB 教程"), array("justOne" => true));
// 显示可用文档数据
cursor = collection->find();
foreach (cursor as document) {
echo $document["title"] . "\n";
}
在php中还可以使用findOne(), save(), limit(), skip(), sort()等方法来操作Mongodb数据库