On this page
update
在本页面
Definition
update
- 2.6 版的新功能。
update命令修改集合中的文档。一个update命令可以包含多个更新语句。 MongoDB 驱动程序提供的更新方法在内部使用此命令。
update命令具有以下语法:
{
update: <collection>,
updates: [
{ q: <query>, u: <update>, upsert: <boolean>, multi: <boolean>,
collation: <document>, arrayFilters: <array> },
{ q: <query>, u: <update>, upsert: <boolean>, multi: <boolean>,
collation: <document>, arrayFilters: <array> },
{ q: <query>, u: <update>, upsert: <boolean>, multi: <boolean>,
collation: <document>, arrayFilters: <array> },
...
],
ordered: <boolean>,
writeConcern: { <write concern> },
bypassDocumentValidation: <boolean>
}
该命令包含以下字段:
Field | Type | Description |
---|---|---|
update |
string | 目标集合的名称。 |
updates |
array | 要在命名集合中执行的一个或多个更新语句的数组。 |
ordered |
boolean | 可选的。如果true ,则当更新语句失败时,不执行其余的更新语句就返回。如果false ,则更新失败时,请 continue 其余的更新语句(如果有)。默认为true 。 |
writeConcern |
document | 可选的。表示update命令的write concern的文档。省略使用默认的写关注。 |
bypassDocumentValidation |
boolean | 可选的。使update 在操作过程中绕过文档验证。这使您可以更新不满足验证要求的文档。 |
版本 3.2 中的新功能。
updates
数组的每个元素包含以下字段:
Field | Type | Description |
---|---|---|
q |
document | 与要更新的文档匹配的查询。使用与find()方法中相同的query selectors。 |
u |
document | 要应用的修改。有关详细信息,请参见Behavior。 |
upsert |
boolean | 可选的。如果是true ,则在没有文档匹配查询的情况下执行插入。如果upsert 和multi 均为 true,并且没有文档与查询匹配,则更新操作仅插入单个文档。 |
multi |
boolean | 可选的。如果true ,则更新所有符合查询条件的文档。如果false ,则将更新限制为符合查询条件的一个文档。默认为false 。 |
collation |
document | Optional. |
指定用于操作的collation。
Collation允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。
排序规则选项具有以下语法:
collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
指定排序规则时,locale
字段为必填字段;所有其他排序规则字段都是可选的。有关字段的说明,请参见Collation Document。
如果未指定排序规则,但是集合具有默认排序规则(请参见db.createCollection()),则该操作将使用为集合指定的排序规则。
如果没有为集合或操作指定排序规则,则 MongoDB 使用先前版本中使用的简单二进制比较进行字符串比较。
您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。
3.4 版中的新功能。
| arrayFilters
| array |可选。筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素。
在更新文档中,使用$[<identifier>]过滤的位置运算符定义标识符,然后在数组过滤器文档中引用该标识符。如果更新文档中未包含标识符,则不能具有数组过滤器文档作为标识符。
Note
<identifier>
必须以小写字母开头,并且只能包含字母数字字符。
您可以在更新文档中多次包含相同的标识符;但是,对于更新文档中的每个唯一标识符($[identifier]
),您必须指定**完全对应的数组过滤器文档。即,您不能为同一标识符指定多个数组过滤器文档。例如,如果更新语句包含标识符x
(可能多次),则不能为arrayFilters
指定以下内容,其中包括x
的 2 个单独的过滤器文档:
[
{ "x.a": { $gt: 85 } },
{ "x.b": { $gt: 80 } }
br]
但是,您可以在单个过滤器文档中的同一标识符上指定复合条件,例如以下示例:
[
{ $or: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }
]
[
{ $and: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }
]
[
{ "x.a": { $gt: 85 },“ x.b”:{ $gt: 80 }}
br]
有关示例,请参见指定用于阵列更新操作的 arrayFilters。
3.6 版中的新功能。
Returns: | 包含操作状态的文档。有关详情,请参见Output。 |
---|
Behavior
<update>
文档可以包含所有update operator表达式或所有field:value
表达式。
更新运算符表达式
如果<update>
文档包含所有update operator表达式,则如下所示:
{
$set: { status: "D" },
$inc: { quantity: 2 }
}
然后,update命令仅更新文档中的相应字段。
字段:值表达式
如果<update>
文档仅包含* field:value
个表达式,例如:
{
status: "D",
quantity: 4
}
然后update命令将匹配的文档替换为更新文档。 update命令只能替换单个匹配的文档。即multi
字段不能为true
。 update命令不会替换_id
值。
Limits
对于updates
数组中的每个更新元素,查询和更新大小(即q
和u
)的总和必须小于或等于BSON 文档的最大大小。
updates
数组中的更新语句总数必须小于或等于maximum bulk size
。
Document Validation
update命令增加了对bypassDocumentValidation
选项的支持,该选项使您可以在使用验证规则在集合中插入或更新文档时绕过document validation。
Examples
更新一个文档的特定字段
使用update operators仅更新文档的指定字段。
例如,给定users
集合,以下命令使用$set和$inc运算符分别修改user
等于"abc123"
的文档的status
和points
字段:
db.runCommand(
{
update: "users",
updates: [
{
q: { user: "abc123" }, u: { $set: { status: "A" }, $inc: { points: 1 } }
}
],
ordered: false,
writeConcern: { w: "majority", wtimeout: 5000 }
}
)
因为<update>
文档未指定可选的multi
字段,所以即使多个文档符合q
匹配条件,更新也仅修改一个文档。
返回的文档表明该命令找到并更新了一个文档。有关详情,请参见Output。
{ "ok" : 1, "nModified" : 1, "n" : 1 }
更新多个文档的特定字段
使用update operators仅更新文档的指定字段,并在更新语句中包括设置为true
的multi
字段。
例如,对于给定的users
集合,以下命令使用$set和$inc运算符分别修改集合中所有文档的status
和points
字段:
db.runCommand(
{
update: "users",
updates: [
{ q: { }, u: { $set: { status: "A" }, $inc: { points: 1 } }, multi: true }
],
ordered: false,
writeConcern: { w: "majority", wtimeout: 5000 }
}
)
此更新会修改与q
字段中指定的查询匹配的所有文档,即与集合中所有文档匹配的空查询。
返回的文档表明该命令找到并更新了多个文档。有关详情,请参见Output。
{ "ok" : 1, "nModified" : 100, "n" : 100 }
Bulk Update
下面的示例对users
集合执行多个更新操作:
db.runCommand(
{
update: "users",
updates: [
{ q: { status: "P" }, u: { $set: { status: "D" } }, multi: true },
{ q: { _id: 5 }, u: { _id: 5, name: "abc123", status: "A" }, upsert: true }
],
ordered: false,
writeConcern: { w: "majority", wtimeout: 5000 }
}
)
返回的文档表明该命令已修改10
文档并插入了_id
值5
的文档。有关详情,请参见Output。
{
"ok" : 1,
"nModified" : 10,
"n" : 11,
"upserted" : [
{
"index" : 1,
"_id" : 5
}
]
}
Specify Collation
3.4 版的新功能。
Collation允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。
集合myColl
具有以下文档:
{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }
以下操作包括collation选项:
db.runCommand({
update: "myColl",
updates: [
{ q: { category: "cafe", status: "a" }, u: { $set: { status: "Updated" } }, collation: { locale: "fr", strength: 1 } }
]
})
为阵列更新操作指定 arrayFilters
3.6 版的新功能。
从 MongoDB 3.6 开始,在更新数组字段时,您可以指定arrayFilters
来确定要更新的数组元素。
更新元素匹配 arrayFilters 条件
创建包含以下文档的集合students
:
db.students.insert([
{ "_id" : 1, "grades" : [ 95, 92, 90 ] },
{ "_id" : 2, "grades" : [ 98, 100, 102 ] },
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }
]);
要修改grades
数组中所有等于或大于100
的元素,请使用带有arrayFilters
选项的过滤后的位置运算符$[<identifier>]:
db.runCommand({
update: "students",
updates: [
{ q: { grades: { $gte: 100 } }, u: { $set: { "grades.$[element]" : 100 } }, arrayFilters: [ { "element": { $gte: 100 } } ], multi: true}
]
})
操作后,集合包含以下文档:
{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 100 ] }
{ "_id" : 3, "grades" : [ 95, 100, 100 ] }
更新一系列文档的特定元素
创建包含以下文档的集合students2
:
db.students2.insert([
{
"_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 }
]
}
]);
要为grades
数组中坡度大于或等于85
的所有元素修改mean
字段的值,请使用过滤后的位置运算符$[<identifier>]和arrayFilters
:
db.runCommand({
update: "students2",
updates: [
{ q: { }, u: { $set: { "grades.$[elem].mean" : 100 } }, arrayFilters: [ { "elem.grade": { $gte: 85 } } ], multi: true }
]
})
操作后,集合具有以下文档:
{
"_id" : 1,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 6 },
{ "grade" : 85, "mean" : 100, "std" : 4 },
{ "grade" : 85, "mean" : 100, "std" : 6 }
]
}
{
"_id" : 2,
"grades" : [
{ "grade" : 90, "mean" : 100, "std" : 6 },
{ "grade" : 87, "mean" : 100, "std" : 3 },
{ "grade" : 85, "mean" : 100, "std" : 4 }
]
}
Output
返回的文档包含以下字段的子集:
update.
ok
- 命令的状态。
update.
n
update.
nModified
update.
upserted
- 文档数组,其中包含通过
upsert: true
通过更新插入的每个文档的信息。
- 文档数组,其中包含通过
每个文档包含以下信息:
update.upserted.
index
- 一个整数,用于标识
updates
数组中的upsert:true
语句的更新,该语句使用从零开始的索引。
- 一个整数,用于标识
update.upserted.
_id
- 所添加文档的
_id
值。
- 所添加文档的
update.
writeErrors
- 文档数组,其中包含有关更新操作期间遇到的任何错误的信息。 writeErrors数组包含每个出错的更新语句的错误文档。
每个错误文档均包含以下字段:
update.writeErrors.
index
- 一个整数,用于标识
updates
数组中的更新语句,该数组使用从零开始的索引。
- 一个整数,用于标识
update.writeErrors.
code
- 标识错误的整数值。
update.writeErrors.
errmsg
- 错误的描述。
update.
writeConcernError
- 描述与写关注有关的错误的文档,其中包含以下字段:
update.writeConcernError.
code
- 标识写关注错误原因的整数值。
update.writeConcernError.
errmsg
- 写关注错误原因的描述。
以下是为成功执行_1s 命令而返回的update命令返回的示例文档:
{
"ok" : 1,
"nModified" : 0,
"n" : 1,
"upserted" : [
{
"index" : 0,
"_id" : ObjectId("52ccb2118908ccd753d65882")
}
]
}
以下是为涉及三个更新语句的批量更新返回的示例文档,其中一个更新语句成功,而另外两个更新语句遇到错误:
{
"ok" : 1,
"nModified" : 1,
"n" : 1,
"writeErrors" : [
{
"index" : 1,
"code" : 16837,
"errmsg" : "The _id field cannot be changed from {_id: 1.0} to {_id: 5.0}."
},
{
"index" : 2,
"code" : 16837,
"errmsg" : "The _id field cannot be changed from {_id: 2.0} to {_id: 6.0}."
},
]
}