外观
MongoDB文档的增、删、改
本章节中我们将向大家介绍如何将数据插入到 MongoDB 的集合中。
文档的数据结构和 JSON 基本一样。
所有存储在集合中的数据都是 BSON 格式。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
MongoDB插入文档
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.save(document)- save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
- insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。该方法也被废弃,推荐使用下方的两种方法。

3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。
db.collection.insertOne() 用于向集合插入一个新文档,语法格式如下:
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)参数说明:
- document:要写入的文档。
- writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
- ordered:指定是否按顺序写入,默认 true,按顺序写入。
示例如下。
db.collection.insertOne():向指定集合中插入一条文档数据。
test> var document = db.test.insertOne({'key': 'value'})
test> document
{
acknowledged: true,
insertedId: ObjectId("64c8889d5a6d80b51405549d")
}
db.collection.insertMany():向指定集合中插入多条文档数据。
test> var res = db.test.insertMany([{'key1': 'value1'}, {'key2': 'value2'}])
test> res
{
acknowledged: true,
insertedIds: {
'0': ObjectId("64c888fa5a6d80b51405549e"),
'1': ObjectId("64c888fa5a6d80b51405549f")
}
}
MongoDB更新文档
MongoDB使用update方法和save方法更新集合中的文档。
使用update方法更新文档的语法如下。
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)参数说明如下。
query:update的查询条件。update:更新操作符。upsert:可选参数,在不存在update记录的情况下,为True则插入objNew,默认为False。multi:可选参数,默认是False,只更新找到的第一条记录。如果为True,找到的记录全部更新。writeConcern:可选参数,表示抛出异常的级别。
update方法已经弃用,推荐使用下方的updateOne和updateMany。
updateOne方法和update方法语法类似,updateMany方法和insertMany方法比较类似。
首先插入数据。
test> use test
already on db test
test> db.test_collection.insertMany([
... {"name":"abc","age":"25","status":"zxc"},
... {"name":"dec","age":"19","status":"qwe"},
... {"name":"asd","age":"30","status":"nmn"},
... ])
{
acknowledged: true,
insertedIds: {
'0': ObjectId("64c90ad84cc5b7546c70efdb"),
'1': ObjectId("64c90ad84cc5b7546c70efdc"),
'2': ObjectId("64c90ad84cc5b7546c70efdd")
}
}
更新一条数据。
test> db.test_collection.updateOne({'name': 'abc'}, {$set: {'age': '28'}})
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
test> db.test_collection.find()
[
{
_id: ObjectId("64c90ad84cc5b7546c70efdb"),
name: 'abc',
age: '28',
status: 'zxc'
},
{
_id: ObjectId("64c90ad84cc5b7546c70efdc"),
name: 'dec',
age: '19',
status: 'qwe'
},
{
_id: ObjectId("64c90ad84cc5b7546c70efdd"),
name: 'asd',
age: '30',
status: 'nmn'
}
]
更新多个文档。
test> db.test_collection.updateMany({'age': {$gt: '10'}}, {$set: {'status': 'xyz'}})
{
acknowledged: true,
insertedId: null,
matchedCount: 3,
modifiedCount: 3,
upsertedCount: 0
}
test> db.test_collection.find()
[
{
_id: ObjectId("64c90ad84cc5b7546c70efdb"),
name: 'abc',
age: '28',
status: 'xyz'
},
{
_id: ObjectId("64c90ad84cc5b7546c70efdc"),
name: 'dec',
age: '19',
status: 'xyz'
},
{
_id: ObjectId("64c90ad84cc5b7546c70efdd"),
name: 'asd',
age: '30',
status: 'xyz'
}
]
参数writeConcern可选的值如下。
- WriteConcern.NONE:没有异常抛出
- WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
- WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
- WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
- WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
- WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
- WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。
移除集合中的键值对,使用的 $unset 操作符:
语法:
{ $unset: { <field1>: "", ... } }如果指定的字段不存在则操作不做任何处理。
db.col.updateOne({"_id":"56064f89ade2f21f36b03136"}, {$set:{ "test2" : "OK"}})
db.col.find()
db.col.updateOne({"_id":"56064f89ade2f21f36b03136"}, {$unset:{ "test2" : "OK"}})
db.col.find()数据存在则更新:
db.collection.updateOne({'title':'MongoDB 教程'}, {$set: {'title':'MongoDB'}})数据存在时不进行操作:
db.collection.updateOne({'title':'MongoDB 教程'}, {$setOnInsert: {'title':'MongoDB'}})以上可扩展为多个字段(查询,更新),如果数据不存在需要插入,设置 upsert:true 即可:
db.collection.updateOne({'title':'MongoDB 教程'}, {$set: {'title':'MongoDB'}},{upsert:true})MongoDB删除文档
实际上最初
remove是用于删除文档的方法,但是此方法目前已经过时。
deleteOne方法用于删除一行文档,deleteMany用于删除多行文档。
db.inventory.deleteMany({})删除 status 等于 A 的全部文档:
db.inventory.deleteMany({ status : "A" })删除 status 等于 D 的一个文档:
db.inventory.deleteOne( { status: "D" } )