MongoDB 命令大全

时间:2023-03-30 18:20:28

库操作

查看当前数据库

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