MongoDB 文档操作

插入文档

insert()

语法格式

insert() 方法的基本格式为:
>db.COLLECTION_NAME.insert(document)

范例1

1
2
3
4
5
6
7
8
9
10
11
>db.mycol.insert(
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "Freak",
"url": "https://rockjins.js.org",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
)

mycol 是上一节所创建的集合的名称。如果数据库中不存在该集合,那么MongoDB会创建该集合,并向其中插入文档。

在插入的文档中,如果我们没有指定_id参数,那么MongoDB会自动为文档指定一个唯一的 ID。
_id是一个 12 字节长的 16 进制数,这 12 个字节的分配如下:

_id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 3 bytes incrementer)

你还可以将用 insert() 方法传入一个文档数组,范例如下:

范例2

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
>db.post.insert([
{
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
title: 'NoSQL Database',
description: 'NoSQL database doesn't have tables',
by: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 20,
comments: [
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2013,11,10,2,35),
like: 0
}
]
}
])

save()

如果没有指定文档的_id,那么save()insert()完全一样。

如果指定了_id,那么它就会覆盖掉save()方法中指定_id的文档的全部数据。

查询文档

find()

查询 MongoDB 集合中的数据,使用 find() 方法。

语法格式

find() 方法基本格式为:

>db.COLLECTION_NAME.find()

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

pretty()

以结构化方式显示结果,使用 pretty()方法。

语法格式

>db.COLLECTION_NAME.find().pretty()

范例

1
2
3
4
5
6
7
8
9
10
11
>db.mycol.find().pretty()
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "Freak",
"url": "https://rockjins.js.org",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
>

find()还有一个扩展方法findOne(),只返回一个文档。

MongoDB 中类似WHERE子句的语句

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

MongoDB中的AND条件

语法格式

find() 方法中,如果传入多个键,并用逗号( , )分隔它们,那么 MongoDB 会把它看成是 AND 条件。AND 条件的基本语法格式为:

>db.mycol.find({key1:value1, key2:value2}).pretty()

范例

下例将展示所有由 “Freak” 发表的标题为 “MongoDB Overview” 的教程。

1
2
3
4
5
6
7
8
9
10
11
>db.mycol.find({"by":"tutorials point","title": "MongoDB Overview"}).pretty()
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "Freak",
"url": "https://rockjins.js.org",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
>

对于上例这种情况,RDBMS 采用的 WHERE 子句将会是:

where by='tutorials point' AND title='MongoDB Overview'

你可以在 find 子句中传入任意的键值对。

MongoDB中的OR条件

语法格式

若基于OR条件来查询文档,可以使用关键字 $or。OR条件的基本语法格式为:

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

范例

下例将展示所有由 “Freak” 发表的或标题为 “MongoDB Overview” 的教程。

1
2
3
4
5
6
7
8
9
10
11
>db.mycol.find({$or:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty()
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "Freak",
"url": "https://rockjins.js.org",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
>

结合使用AND与OR条件

范例

下例所展示文档的条件为:喜欢数大于100,标题是“MongoDB Overview”,或者是由“Freak” 所发表的。相应的SQL WHERE子句为:where likes>10 AND (by = 'tutorials point' OR title = 'MongoDB Overview')

1
2
3
4
5
6
7
8
9
10
11
>db.mycol.find({"likes": {$gt:10}, $or: [{"by": "Freak"},{"title": "MongoDB Overview"}]}).pretty()
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "Freak",
"url": "https://rockjins.js.org",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
>

更新文档

MongoDB 中的 update()save() 方法都能用于更新集合中的文档。 update() 方法更新已有文档中的值,而 save() 方法则是用传入该方法的文档来替换已有文档。

update()方法

update()方法更新已有文档中的值。

语法格式

update() 方法基本格式如下:

>db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)

范例

假如mycol集合中有下列数据:

1
2
3
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

下面的例子将把文档原标题 ‘MongoDB Overview’ 替换为新的标题 ‘New MongoDB Tutorial’。

1
2
3
4
5
6
>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}})
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"New MongoDB Tutorial"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

MongoDB默认只更新单个文档,要想更新多个文档,需要把参数multi设为true

>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}},{multi:true})

save()方法

save() 方法利用传入该方法的文档来替换已有文档。

语法格式

save() 方法基本语法格式如下:

>db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})

范例

下例用_id为’5983548781331adf45ec5’的文档代替原有文档。

1
2
3
4
5
6
7
8
9
10
>db.mycol.save(
{
"_id" : ObjectId(5983548781331adf45ec5), "title":"Tutorials Point New Topic", "by":"Tutorials Point"
}
)
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"Tutorials Point New Topic", "by":"Tutorials Point"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

删除文档

remove()方法

MongoDB利用 remove() 方法 清除集合中的文档。它有2个可选参数:

  • deletion criteria:(可选)删除文档的标准。
  • justOne:(可选)如果设为true或1,则只删除一个文档。

语法格式

remove() 方法的基本语法格式如下所示:
>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

范例

假如 mycol 集合中包含下列数据:

1
2
3
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

下面我们将删除其中所有标题为 ‘MongoDB Overview’ 的文档。

1
2
3
4
5
>db.mycol.remove({'title':'MongoDB Overview'})
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

只删除一个文档

如果有多个记录,而你只想删除第一条记录,那么就设置remove()方法中的justOne参数:

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

删除所有文档

如果没有指定删除标准,则 MongoDB 会将集合中所有文档都予以删除。这等同于 SQL 中的 truncate 命令。

1
2
3
>db.mycol.remove()
>db.mycol.find()
>

本文作者:余震(Freak)
本文出处:Rockjins Blog
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN许可协议。转载请注明出处!

坚持,您的支持将鼓励我继续爬下去!