抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

MongoDB基本操作

创建数据库

语法

MongoDB 创建数据库的语法格式如下:

1
use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。

实例

以下实例我们创建了数据库 blog

1
2
3
4
5
> use blog
switched to db blog
> db
blog
>

如果你想查看所有数据库,可以使用 show dbs 命令:

1
2
3
4
5
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>

可以看到,我们刚创建的数据库 runoob 并不在数据库的列表中, 要显示它,我们需要向 blog数据库插入一些数据。

1
2
3
4
5
6
7
8
> db.blog.insert({"name":"晓风残月的blog"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
blog 0.000GB
config 0.000GB
local 0.000GB
>

MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。

注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。

删除数据库

语法

MongoDB 删除数据库的语法格式如下:

1
db.dropDatabase()

删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。

实例

以下实例我们删除了数据库 blog。

首先,查看所有数据库:

1
2
3
4
5
> show dbs
admin 0.000GB
blog 0.000GB
config 0.000GB
local 0.000GB

接下来我们切换到数据库 blog:

1
2
3
4
5
> use blog
switched to db blog
> db
blog
>

执行删除命令:

1
2
3
> db.dropDatabase()
{ "dropped" : "blog", "ok" : 1 }
>

最后,我们再通过 show dbs 命令数据库是否删除成功:

1
2
3
4
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

创建集合

语法

MongoDB 中使用 createCollection() 方法来创建集合。

1
db.createCollection(name, options)

参数说明:

  • name: 要创建的集合名称
  • options: 可选参数, 指定有关内存大小及索引的选项

options 可以是如下参数:

字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size 数值 (可选)为固定集合指定一个最大值,以千字节计(KB)。 如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。

在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。

实例

在 test 数据库中创建 blog 集合:

1
2
3
4
5
> use test
switched to db test
> db.createCollection("blog")
{ "ok" : 1 }
>

如果要查看已有集合,可以使用 show collectionsshow tables 命令:

1
2
3
4
5
> show tables
blog
> show collections
blog
>

下面是带有几个关键参数的 createCollection() 的用法:

创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。

1
2
3
4
5
6
> db.createCollection("mycol", { capped : true, autoIndexId : true, size :    6142800, max : 10000 })
{
"note" : "the autoIndexId option is deprecated and will be removed in a future release",
"ok" : 1
}
>

在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

1
2
3
4
5
6
7
> db.mycol5.insert({"name" : "晓风残月"})
WriteResult({ "nInserted" : 1 })
> show tables;
blog
mycol
mycol5
>

删除集合

语法

MongoDB 中使用 drop() 方法来删除集合。

1
db.collection.drop()
返回值

如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。

实例

在数据库 blog中,我们可以先通过 show collections 或者 show collections 命令查看已存在的集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
> use test
switched to db test
> show collections
blog
mycol
mycol5
> db.blog.drop()
true
> db.mycol.drop()
true
> db.mycol5.drop()
true
>

通过 show collections 再次查看数据库 test中的集合:

1
2
> show collections
>

从结果中可以看出 所有的集合已被删除。

插入文档

文档的数据结构和 JSON 基本一样。

所有存储在集合中的数据都是 BSON 格式。

BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

语法

MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:

1
db.collection.insert(document)

实例

普通插入

以下文档可以存储在 MongoDB 的 test数据库 的 blog集合中:

1
2
3
4
5
6
7
8
9
10
11
> use test
switched to db test
> db.blog.insert({title: 'MongoDB 教程',
... description: 'MongoDB 是一个 Nosql 数据库',
... aouth: '晓风残月',
... url: 'www.baiyp.ren',
... tags: ['mongodb', 'database', 'NoSQL'],
... likes: 100
... })
WriteResult({ "nInserted" : 1 })
>

以上实例中 col 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。

查看已插入文档
1
2
3
> db.blog.find()
{ "_id" : ObjectId("5e3d22117e132b8078babb03"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "aouth" : "晓风残月", "url" : "www.baiyp.ren", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
>
定义变量插入

我们也可以将数据定义为一个变量,如下所示:

1
2
3
4
5
6
7
 document=({title: 'MongoDB 教程',
... description: 'MongoDB 是一个 Nosql 数据库',
... aouth: '晓风残月',
... url: 'www.baiyp.ren',
... tags: ['mongodb', 'database', 'NoSQL'],
... likes: 100
... })

执行后显示结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
{
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
执行插入操作
1
2
3
> db.blog.insert(document)
WriteResult({ "nInserted" : 1 })
>

插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。

更新文档

MongoDB 使用 update()save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。

update() 方法

语法

update() 方法用于更新已存在的文档。语法格式如下:

1
2
3
4
5
6
7
8
9
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。
实例

我们在集合 blog中插入如下数据:

1
2
3
4
5
6
7
db.blog.insert({title: 'MongoDB 教程', 
description: 'MongoDB 是一个 Nosql 数据库',
aouth: '晓风残月',
url: 'www.baiyp.ren',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})

接着我们通过 update() 方法来更新标题(title):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
> db.blog.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.blog.find().pretty()
{
"_id" : ObjectId("5e3d22117e132b8078babb03"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
{
"_id" : ObjectId("5e3d23ee7e132b8078babb04"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>

可以看到标题(title)由原来的 “MongoDB 教程” 更新为了 “MongoDB”。

以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。

1
db.blog.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})

save() 方法

语法

save() 方法通过传入的文档来替换已有文档。语法格式如下:

1
2
3
4
5
6
db.collection.save(
<document>,
{
writeConcern: <document>
}
)

参数说明:

  • document : 文档数据。
  • writeConcern :可选,抛出异常的级别。
实例

以下实例中我们替换了 _id 为 5e3d22117e132b8078babb03 的文档数据:

1
2
3
4
5
6
7
8
9
10
> db.blog.save({
_id : ObjectId("5e3d22117e132b8078babb03"),
title: 'MongoDB 教程-save保存',
description: 'MongoDB 是一个 Nosql 数据库',
aouth: '晓风残月',
url: 'www.baiyp.ren',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

替换成功后,我们可以通过 find() 命令来查看替换后的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
> db.blog.find().pretty()
{
"_id" : ObjectId("5e3d22117e132b8078babb03"),
"title" : "MongoDB 教程-save保存",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
{
"_id" : ObjectId("5e3d23ee7e132b8078babb04"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>

更多实例

只更新第一条记录:

db.blog.update( { “count” : { $gt : 1 } } , { $set : { “test2” : “OK”} } );

全部更新:

db.blog.update( { “count” : { $gt : 3 } } , { $set : { “test2” : “OK”} },false,true );

只添加第一条:

db.blog.update( { “count” : { $gt : 4 } } , { $set : { “test5” : “OK”} },true,false );

全部添加进去:

db.blog.update( { “count” : { $gt : 5 } } , { $set : { “test5” : “OK”} },true,true );

全部更新:

db.blog.update( { “count” : { $gt : 15 } } , { $inc : { “count” : 1} },false,true );

只更新第一条记录:

db.blog.update( { “count” : { $gt : 10 } } , { $inc : { “count” : 1} },false,false );

删除文档

MongoDB remove()函数是用来移除集合中的数据。

MongoDB数据更新可以使用update()函数。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。

语法

remove() 方法的基本语法格式如下所示:

1
2
3
4
db.collection.remove(
<query>,
<justOne>
)

如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:

1
2
3
4
5
6
7
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)

参数说明:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
  • writeConcern :(可选)抛出异常的级别。

实例

使用 find() 函数查询数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
> db.blog.find().pretty()
{
"_id" : ObjectId("5e3d22117e132b8078babb03"),
"title" : "MongoDB 教程-save保存",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
{
"_id" : ObjectId("5e3d23ee7e132b8078babb04"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>

接下来我们移除 title 为 ‘MongoDB 教程-save保存’ 的文档:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> db.blog.remove({'title':'MongoDB 教程-save保存'}))
WriteResult({ "nRemoved" : 1 }) # 删除了一条数据

> db.blog.find().pretty()
{
"_id" : ObjectId("5e3d23ee7e132b8078babb04"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>

如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:

1
>db.collection.remove(DELETION_CRITERIA,1)

如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):

1
2
>db.blog.remove({})
>db.blog.find()

deleteMany

remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法。

如删除集合下全部文档:

1
db.blog.deleteMany({})

删除 title 等于 MongoDB 的全部文档:

1
db.blog.deleteMany({ title : "MongoDB" })

查询文档

MongoDB 查询文档使用 find() 方法。

find() 方法以非结构化的方式来显示所有文档。

语法

MongoDB 查询数据的语法格式如下:

1
2
db.collection.find(query, projection)

参数说明:

  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

1
>db.blog.find().pretty()

pretty() 方法以格式化的方式来显示所有文档。

实例

以下实例我们查询了集合 blog中的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
> db.blog.find().pretty()
{
"_id" : ObjectId("5e3d2d2d2f6dbf1604d79284"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
{
"_id" : ObjectId("5e3d2d992f6dbf1604d79285"),
"title" : "Redis教程",
"description" : "Redis 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"Redis",
"database",
"NoSQL"
],
"likes" : 100
}
{
"_id" : ObjectId("5e3d2da22f6dbf1604d79286"),
"title" : "Mysql 教程",
"description" : "Mysql 是一个 普通 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"Mysql",
"database"
],
"likes" : 100
}
>

除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> db.blog.findOne()
{
"_id" : ObjectId("5e3d2d2d2f6dbf1604d79284"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>

与 RDBMS Where 语句比较

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

操作 格式 范例 RDBMS中的类似语句
等于 {:} db.col.find({"by":"菜鸟教程"}).pretty() where by = '菜鸟教程'
小于 {:{$lt:}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {:{$lte:}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {:{$gt:}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {:{$gte:}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {:{$ne:}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

AND 条件

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。

语法
1
>db.collection.find({key1:value1, key2:value2}).pretty()
实例

以下实例通过 aouthtitle 键来查询 晓风残月MongoDB 教程 的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> db.blog.find({'aouth':'晓风残月','title':'MongoDB 教程'}).pretty()
{
"_id" : ObjectId("5e3d2d2d2f6dbf1604d79284"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>

以上实例中类似于 WHERE 语句:WHERE aouth=’晓风残月’ AND title=’MongoDB 教程’

OR 条件

语法

MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

1
2
3
4
5
6
7
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
实例

以下实例中,我们演示了查询键 aouth 值为 晓风残月 或键 title 值为 MongoDB 教程 的文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
> db.blog.find({$or:[{'aouth':'晓风残月'},{'title':'MongoDB 教程'}]}).pretty()
{
"_id" : ObjectId("5e3d2d2d2f6dbf1604d79284"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
{
"_id" : ObjectId("5e3d2d992f6dbf1604d79285"),
"title" : "Redis教程",
"description" : "Redis 是一个 Nosql 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"Redis",
"database",
"NoSQL"
],
"likes" : 100
}
{
"_id" : ObjectId("5e3d2da22f6dbf1604d79286"),
"title" : "Mysql 教程",
"description" : "Mysql 是一个 普通 数据库",
"aouth" : "晓风残月",
"url" : "www.baiyp.ren",
"tags" : [
"Mysql",
"database"
],
"likes" : 100
}
>

AND 和 OR 联合使用

以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: ‘where likes>50 AND (aouth = ‘晓风残月’ OR title = ‘MongoDB 教程’)’

1
db.blog.find({'likes':{$gt:50}},{$or:[{'aouth':'晓风残月'},{'title':'MongoDB 教程'}]}).pretty()

评论