本章介绍了MongoDB的常用操作,具体包括如下:
db.collection.update(query, update, options):修改已经存在的文档,还可以修改指定的字段或者替换整个文档。
语法
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
arrayFilters: [<filterdocument1>, ...]
}
)
参数 | 类型 | 说明 |
---|---|---|
query | document | 查询条件 |
update | document or pipeline | 如果是文档则替换;如果是$set修改器更新字段 |
upsert | boolean | 可选。 如果为true,匹配则更新,否则插入文档。 默认值false。 |
multi | boolean | 可选。 如果为true,更新匹配多个文档。 如果为false,更新一条文档。 默认值false。 |
arrayFilters | array | 可选。数组筛选,根据筛选条件,筛选出要更新的数组元素。 |
文档替换:文档替换是最简单的更新,用新文档去替换旧的文档,比较适合于大规模数据迁移。
db.user.remove()
db.user.insertMany([
{"_id": 1, "user_name": "tom", "age": 20},
{"_id": 2, "user_name": "Abc", "age": 21}
])
-- 这里把_id为1的文档替换成_id为3的文档
db.user.update({"_id": 1}, {"_id": 3, "user_name": "hello", "age": 22})
部分字段更新:使用更新修改器来更新部分字段,而不是替换文档。
db.user.remove({})
db.user.insertMany([
{"_id": 1, "user_name": "tom", "age": 20},
{"_id": 2, "user_name": "Abc", "age": 21}
])
-- 使用$set修改字段时,不存在则创建;存在就更新
db.user.update({"_id"}, {"$set": {"user_name": "ABC"}})
更多修改器使用方法参考:MongoDB官网
数组修改:修改文档的数组字段时,需要使用$push修改器。如果数组不存在,则会创建数组;如果数组存在,则向数组追加元素。
db.books.remove({})
db.books.insertMany([
{"_id": 1, "name": "Java编程思想", tag: ["java"]},
{"_id": 2, "name": "代码重构"}
])
db.books.update({}, {$push: {"tag": "经典"}}, {multi: true})
{"_id": 1, "name": "Java编程思想", tag: ["java", "经典"]},
{"_id": 2, "name": "代码重构", tag: ["经典"]}
删除字段:移除字段
db.books.update({}, {$unset: {"tag": 1 }}, {multi: true})
{"_id": 1, "name": "Java编程思想"},
{"_id": 2, "name": "代码重构"}
数组过滤器:我们可以为数组指定一个标识符,然后根据标识符去更新数组中的符合条件的元素。
一个数组标识符只能标识一个数组。
-- 筛选出数组x下的x.a>85 or x.b > 80的文档
arrayFilters: [ {"or": [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }]
-- 这是不合法的,同一个数组有两个标识符
arrayFilters: [
{"x.a": {$gt: 85}},
{"x.b": {$gt: 80}}
]
-- 这是合法的,两个不同的数组有不同数组标识符
arrayFilters: [
{"x.a": {$gt: 85}},
{"y.b": {$gt: 80}}
]
db.students2.insertMany([
{
"_id" : 1,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 6 },
{ "grade" : 85, "mean" : 90, "std" : 4 },
{ "grade" : 85, "mean" : 85, "std" : 6 }
]
}
{
"_id" : 2,
"grades" : [
{ "grade" : 90, "mean" : 75, "std" : 6 },
{ "grade" : 87, "mean" : 90, "std" : 3 },
{ "grade" : 85, "mean" : 85, "std" : 4 }
]
}
])
db.students2.update(
{ },
{ $set: { "grades.$[elem].mean" : 100 } },
{
multi: true,
arrayFilters: [ { "elem.grade": { $gte: 85 } } ]
}
)
upsert:匹配则更新,否则插入一条文档。创建新文档的字段来自query和update里。
db.books.update(<query>, <update>, {upsert: true})
-- 没有这条记录时
db.books.update(
{item: "ABC123"},
{$set: {"name": "java", "tags": [1,2,3]}},
{upsert: true}
)
{
"_id": ObjectId("5da79019835b2f1c75348a0a"),
"item": "ABC123",
"name": "java",
"tags": [1,2,3]
}
关于upsert的操作,官网讲得很详细。传送门