库操作
查看当前数据库
db
查看所有数据库
show databases
show dbs
创建数据库
use database_name
删除数据库
use database_name
db.dropDatabase('database_name')
使用数据库
use database_name
集合操作
查看所有集合
show tables
show collections
创建集合
db.createCollection("collection")
删除集合
db.collection.drop()
修改集合名
renameCollection()
方法可以修改集合的名称。语法格式如下:
db.collection.renameCollection( newName, dropTarget )
其中,collection
表示需要修改的集合名,newName
表示集合新的名称,dropTarget
表示是否覆盖同名的集合,默认为 false。
例如,以下代码将把集合 mycollection
的名称修改为 newcollection
:
db.mycollection.renameCollection("newcollection")
拷贝集合
该方法需要先复制原始集合的内容到新的集合中。语法格式如下:
db.collection.copyTo( newCollection )
数据操作
插入数据
使用 insertOne()
方法可以将单个文档插入 MongoDB 集合中。语法格式如下:
db.collection.insertOne(
<document>
)
其中,<document>
表示需要插入的文档对象。例如,以下示例将插入一个名为 John 的文档,并将其年龄设置为 25:
db.collection.insertOne({"name": "John", "age": 25})
查询数据
使用 find()
方法可以从 MongoDB 集合中检索数据。语法格式如下:
db.collection.find(
<query>,
<projection>
)
其中,<query>
表示查询条件,<projection>
表示指定返回结果中包含的字段。例如,以下示例将返回名为 John 的所有文档:
db.collection.find({"name": "John"})
更新数据
使用 updateOne()
方法可以更新 MongoDB 集合中的单个文档。语法格式如下:
db.collection.updateOne(
<filter>,
<update>,
<options>
)
其中,<filter>
表示指定要更新的文档,<update>
表示需要更新的字段和值,<options>
表示更新选项。例如,以下示例将选中名为 John 的文档,并更新其年龄字段为 30 岁:
db.collection.updateOne(
{"name": "John"},
{"$set": {"age": 30}}
)
删除数据
使用 remove()
方法可以删除 MongoDB 集合中的文档。语法格式如下:
db.collection.remove(
<query>,
<options>
)
其中,<query>
表示指定要删除的文档,<options>
表示删除选项。例如,以下示例将删除所有名为 John 的文档中的文档:
db.collection.remove({"name": "John"})
插入多条数据
使用 insert()
方法可以将多个文档一起插入到 MongoDB 集合中。语法格式如下:
db.collection.insert(
[ <document 1> , <document 2>, ... ],
<options>
)
其中,<document>
表示需要插入的文档对象数组,<options>
表示插入选项。例如,以下示例将一次性插入三个文档:
db.collection.insert([
{"name": "John", "age": 25},
{"name": "Mary", "age": 30},
{"name": "Tom", "age": 35}
])
使用脚本插入数据
for(let i = 1;i <= 10000;i++) {
db.collection.insert({_id:i,name:'user_' + i,age:i % 99})
}
更新多条数据
需要在更新的选项中加入 multi: true
选项。具体语法如下:
db.collection.update(
<query>,
<update>,
{
multi: true,
...
}
)
其中,<query>
表示需要更新的文档条件,<update>
表示需要更新的字段和值,multi
表示是否更新多个文档,默认为 false。
例如,以下代码将更新所有名字为 John 的文档,将其年龄字段增加 5 岁:
db.collection.update(
{"name": "John"},
{"$inc": {"age": 5}},
{multi: true}
)
and 和 or 操作符
MongoDB 支持 and 和 or 操作符。要在查询中使用 AND 操作符,请使用逗号隔开的查询条件:
db.collection.find({"name": "John", "age": 25})
要使用 OR 操作符,请使用 $or
查询参数:
db.collection.find({
"$or": [
{"name": "John"},
{"age": 25}
]
})
排序
使用 sort()
方法,可以对查询结果进行排序。默认情况下,sort()
方法按升序进行排序。以下示例将从 collection
集合中按升序排列名为 "John" 的文档:
db.collection.find({"name": "John"}).sort({"age": 1})
要以降序排序,请将 1
替换为 -1
:
db.collection.find({"name": "John"}).sort({"age": -1})
分页和总条数
在 Mongo shell 中,可以使用 limit()
方法限制查询结果的数量。要查询指定数据之后的数据,可以使用 skip()
方法。以下示例检索从第 11 条开始的排名前 5 名的所有文档:
db.collection.find().skip(10).limit(5)
要查询符合特定条件的文档的总数,请使用 count()
方法。以下示例查找名为 "John" 的文档的总数:
db.collection.find({"name": "John"}).count()
正则表达式查询
在 find()
方法的查询条件中,可以使用正则表达式来模糊匹配数据。例如,以下示例以 Jo 开头的名字进行模糊查询:
db.collection.find({"name": /^Jo/})
去重查询
使用 distinct()
方法可以删除多个文档中包含的重复值。例如:
db.collection.distinct("name")
返回指定字段
不需要查询所有字段数据,这时可以使用 find()
方法返回指定字段。以下是一个示例:
db.collection.find({}, {"name": 1, "_id": 0})
查询语句 {}
是查询条件,其中 "_id": 0
参数是我们用来指定不包括 _id
在返回值中。另一个参数 {"name": 1}
指定需要返回的字段,而 1
表示将该字段包括在返回值中。
$type操作符
$type
操作符是 MongoDB 中用于判断某个字段的类型的操作符。其语法格式如下:
{ <field>: { $type: <BSON type> } }
例如,以下代码将查询 collection
集合中 age 字段类型码为 16
,即整数类型的文档:
db.collection.find( { "age": { $type: 16 } } )
db.collection.find( { "age": { $type: 'int'} } )
上述代码用于查询整数类型的文档。您也可以结合 $regex
操作符实现更复杂的查询。例如,以下代码将查询 collection
集合中所有包含数字元素的文档:
db.collection.find( { age: { $type: 16 }, name: {$regex:/\d/ } } )
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃。 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1 . |
Max key | 127 |
聚合查询
MongoDB 支持聚合操作,用于对集合数据进行统计和分组
db.collection.aggregate( [
{ <stage> },
{ <stage> },
...
] )
其中,<stage>
表示聚合操作阶段,可以包括多个阶段。例如,以下示例将返回年龄大于 25 岁的文档的平均年龄:
db.collection.aggregate([
{"$match": {"age": {"$gt": 25}}},
{"$group": {"_id": null, "avgAge": {"$avg": "$age"}}},
{"$project": {"_id": false, "avgAge": true}}
])
下表展示了一些聚合的表达式:
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 将值加入一个数组中,不会判断是否有重复的值。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
索引操作
创建索引
MongoDB 的索引格式是 B 树(B-Tree),它特别适用于范围查询及排序操作。下面是一个简单的示例来创建一个 name 字段上的索引:
db.collection.createIndex({"name": 1});
创建一个通用的多键索引(multikey index),例如:
db.collection.createIndex({"interests": 1});
在这个示例中,在 interests 字段上创建了一个升序的多键索引。相比于单键索引,多键索引可用于包含数组或嵌入式文档的字段上。在上述示例中,如果 interests 是包含多个兴趣爱好的数组,则 MongoDB 将对集合中的每个文档中的每个兴趣爱好创建一个索引条目。
createIndex() 接收可选参数,可选参数列表如下:
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。 |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
dropDups | Boolean | **3.0+版本已废弃。**在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
例如,在 zip 字段上创建一个唯一的稀疏索引,并在后台创建:
db.collection.createIndex({"zip": 1}, {unique: true, sparse: true, background: true});
sparse 参数设置为 true,所以 MongoDB 只会在存在 zip 字段的文档上创建索引。
获取索引
db.user.getIndex()
删除索引
使用dropIndexes()
方法,删除所有索引
db.collection.dropIndexes()
使用 dropIndex()
方法,指定要删除的索引的名称即可。以下是示例:
db.collection.dropIndex("name_1");
也可以使用数组形式的语法来删除索引,例如:
db.collection.dropIndex({"name": 1});
用户权限操作
创建用户
连接到 MongoDB 数据库并切换到管理员角色。
use admin
创建一个名为 myuser
的用户,并指定密码为 mypass
。
db.createUser(
{
user: "myuser",
pwd: "mypass",
roles: [ { role: "readWrite", db: "mydb" } ]
}
)
在上面的代码中,我们使用 createUser()
方法创建了一个用户,并将 mydb
数据库的 readWrite
权限分配给了这个用户。这表示用户可以读取和写入该数据库中的所有集合。如果需要访问多个数据库,则可以在 roles
数组中指定多个对象来分配多个角色。
连接到指定数据库,并使用刚创建的用户名和密码进行身份验证。
mongo -u myuser -p mypass --authenticationDatabase mydb
在上面的代码中,我们使用 -u
和 -p
参数为连接提供用户名和密码,并使用 --authenticationDatabase
参数指定要进行身份验证的数据库。在此之后,我们可以使用 MongoDB shell 访问数据库,并进行相应的操作。
需要注意的是,在生产环境中,为了增加安全性,建议使用更强的密码,并根据需要为用户分配更权益不同的角色来限制其访问范围
。
删除用户
连接到 MongoDB 数据库并切换到管理员角色。
use admin
使用 dropUser()
方法删除指定的用户。假设要删除名为 myuser
的用户,可以执行以下命令:
db.dropUser("myuser")
在上述命令中,dropUser()
方法的参数为要删除的用户名。
验证是否已成功删除用户。可以使用 show users
命令查看所有用户的列表。
show users