MongoDB文档基本操作
MongoDB插入文档
文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。
BSON是一种类JSON的一种二进制形式的存储格式,简称Binary JSON。
插入文档语法
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
插入文档实例
以下文档可以存储在 MongoDB 的 appblog 数据库 的 site 集合中:
> db.site.insert({title: 'MongoDB文档基本操作',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'APP开发技术博客',
url: 'http://www.appblog.cn',
tags: ['MongoDB', 'database', 'NoSQL'],
likes: 100
})
以上实例中 site 是我们的集合名,如果该集合不在该数据库中,MongoDB 会自动创建该集合并插入文档。
查看已插入文档:
> db.site.find()
{ "_id" : ObjectId("5aebc8fd851561202b93df06"), "title" : "MongoDB文档基本操作", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "APP开发技术博客", "url" : "http://www.appblog.cn", "tags" : [ "MongoDB", "database", "NoSQL" ], "likes" : 100 }
>
我们也可以将数据定义为一个变量,如下所示:
> document = ({title: 'MongoDB文档基本操作',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'APP开发技术博客',
url: 'http://www.appblog.cn',
tags: ['MongoDB', 'database', 'NoSQL'],
likes: 100
});
执行后显示结果如下:
{
"title" : "MongoDB文档基本操作",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "APP开发技术博客",
"url" : "http://www.appblog.cn",
"tags" : [
"MongoDB",
"database",
"NoSQL"
],
"likes" : 100
}
执行插入操作:
> db.site.insert(document)
WriteResult({ "nInserted" : 1 })
插入文档也可以使用
db.col.save(document)
命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
MongoDB 3.2 版本后提供可用于插入文档的语法
db.collection.insertOne()
:向指定集合中插入一条文档数据
db.collection.insertMany()
:向指定集合中插入多条文档数据
- 插入单条数据
> var document = db.collection.insertOne({"a": 3})
> document
{
"acknowledged" : true,
"insertedId" : ObjectId("5aebcafb851561202b93df08")
}
- 插入多条数据
> var res = db.collection.insertMany([{"b": 1}, {'c': 2}])
> res
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5aebcb6c851561202b93df09"),
ObjectId("5aebcb6c851561202b93df0a")
]
}
MongoDB更新文档
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。
update() 方法
语法
update() 方法用于更新已存在的文档。语法格式如下:
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
:可选,抛出异常的级别。-
- WriteConcern.NONE:没有异常抛出
-
- WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
-
- WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作
-
- WriteConcern.MAJORITY:抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作
-
- WriteConcern.FSYNC_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘
-
- WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件
-
- WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作
实例
我们在集合 col 中插入如下数据:
> db.col.insert({title: 'MongoDB文档基本操作',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'APP开发技术博客',
url: 'http://www.appblog.cn',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
接着我们通过 update() 方法来更新标题(title):
> db.col.update({'title':'MongoDB文档基本操作'}, {$set:{'title':'MongoDB文档更新操作'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find().pretty()
{
"_id" : ObjectId("5aebcfa8851561202b93df0c"),
"title" : "MongoDB文档更新操作",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "APP开发技术博客",
"url" : "http://www.appblog.cn",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
可以看到标题(title)由原来的 "MongoDB文档基本操作" 更新为 "MongoDB文档更新操作"。
以上语句只会修改第一条发现的文档,如果需要修改多条相同的文档,则需要设置 multi 参数为 true。
> db.col.update({'title':'MongoDB文档基本操作'}, {$set:{'title':'MongoDB文档更新操作'}}, {multi:true})
save() 方法
语法
save() 方法通过传入的文档来替换已有文档。语法格式如下:
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
参数说明:
- document:文档数据。
- writeConcern:可选,抛出异常的级别。
实例
以下实例中我们替换了 _id 为 5aebcfa8851561202b93df0c 的文档数据:
> db.col.save({
"_id" : ObjectId("5aebcfa8851561202b93df0c"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "APP开发技术博客",
"url" : "http://www.appblog.cn",
"tags" : [
"MongoDB",
"NoSQL"
],
"likes" : 110
})
替换成功后,我们可以通过 find() 命令来查看替换后的数据
> db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "APP开发技术博客",
"url" : "http://www.appblog.cn",
"tags" : [
"MongoDB",
"NoSQL"
],
"likes" : 110
}
更多实例
只更新第一条记录:
db.col.update( { "count" : { $gt : 8 } } , { $set : { "test" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 8 } } , { $set : { "test" : "OK"} }, false, true );
只添加第一条:
db.col.update( { "count" : { $gt : 8 } } , { $set : { "test" : "OK"} }, true, false );
全部添加进去:
db.col.update( { "count" : { $gt : 8 } } , { $set : { "test" : "OK"} }, true, true );
全部更新:
db.col.update( { "count" : { $gt : 8 } } , { $inc : { "count" : 1} }, false, true );
只更新第一条记录:
db.col.update( { "count" : { $gt : 8 } } , { $inc : { "count" : 1} }, false, false );
MongoDB 3.2版本开始,MongoDB提供更新集合文档的方法
db.collection.updateOne()
:向指定集合更新单个文档db.collection.updateMany()
:向指定集合更新多个文档
首先我们在test集合里插入测试数据
use test
db.test_collection.insert([
{"name":"china","age":"20","status":"a"},
{"name":"america","age":"19","status":"b"},
{"name":"russia","age":"18","status":"c"},
])
更新单个文档
> db.test_collection.updateOne({"name":"china"},{$set:{"age":"28"}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.test_collection.find()
{ "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "china", "age" : "28", "status" : "a" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "america", "age" : "19", "status" : "b" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "russia", "age" : "18", "status" : "c" }
>
更新多个文档
> db.test_collection.updateMany({"age":{$gt:"10"}},{$set:{"status":"xyz"}})
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
> db.test_collection.find()
{ "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "china", "age" : "28", "status" : "xyz" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "america", "age" : "19", "status" : "xyz" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "russia", "age" : "18", "status" : "xyz" }
>
MongoDB删除文档
remove() 方法
MongoDB remove()函数是用来移除集合中的数据。
MongoDB数据更新可以使用update()函数。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
语法
remove() 方法的基本语法格式如下所示:
db.collection.remove(
<query>,
<justOne>
)
如果 MongoDB 是 2.6 版本以后的,语法格式如下:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
参数说明:
- query:(可选)删除的文档的条件。
- justOne:(可选)如果设为 true 或 1,则只删除一个文档。
- writeConcern:(可选)抛出异常的级别。
实例
以下文档我们执行两次插入操作:
> db.col.insert({title: 'MongoDB文档基本操作',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'APP开发技术博客',
url: 'http://www.appblog.cn',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
使用 find() 函数查询数据:
> db.col.find()
{ "_id" : ObjectId("5aebc8fd851561202b93df06"), "title" : "MongoDB文档基本操作", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "APP开发技术博客", "url" : "http://www.appblog.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5aebca2c851561202b93df07"), "title" : "MongoDB文档基本操作", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "APP开发技术博客", "url" : "http://www.appblog.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
>
接下来我们移除 title 为 'MongoDB文档基本操作' 的文档:
> db.col.remove({'title':'MongoDB文档基本操作'})
WriteResult({ "nRemoved" : 2 }) # 删除了两条数据
> db.col.find()
…… # 没有数据
如果只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:
> db.col.remove({'title':'MongoDB文档基本操作'}, {justOne:1})
如果想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
> db.col.remove({})
deleteOne() 和 deleteMany() 方法
remove() 方法已经过时,现在官方推荐使用 deleteOne() 和 deleteMany() 方法。
如删除集合下全部文档:
db.inventory.deleteMany({})
删除 status 等于 A 的全部文档:
```javascript
db.inventory.deleteMany({ status : "A" })
删除 status 等于 D 的一个文档:
db.inventory.deleteOne( { status: "D" } )
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/12/mongodb-document-basic-operations/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论