我有像这样的对象
{
"_id" : ObjectId("5742be02289512cf98bf63e3"),
"name" : "test1",
"name" : "test1",
"attributes" : [
{
"name" : "x",
"color" : "0xd79c9c",
"_id" : ObjectId("5742be02289512cf98bf63e8")
},
{
"name" : "y",
"color" : "0xd79c9c",
"_id" : ObjectId("5742be02289512cf98bf63e7")
},
{
"name" : "z",
"color" : "0xd79c9c",
"_id" : ObjectId("5742be02289512cf98bf63e6")
}
],
"__v" : 6
}
我想更新所有文档,并为每个属性设置新字段。 所以我想运行单个查询,一次更新所有文档。我想,这个查询会做到这一点
db.spaces.update({}, { $set: { "attributes.0.weight": 2 } }, {multi: true})
但是当我运行此查询时,我收到错误。
"代码" :16837,
" ERRMSG" :"位置操作员没有找到 匹配需要查询。未更新的更新:属性。$。weight"
所以我不明白为什么。 请帮忙
答案 0 :(得分:18)
您需要将数组字段包含在查询文档中,才能使用 positional operator
。
例如,如果您想更新第一个数组元素,即{ "attributes.name": "x" }
,那么您可以遵循以下模式:
db.spaces.update(
{ "attributes.name": "x" }, // <-- the array field must appear as part of the query document.
{ "$set": { "attributes.$.weight": 2 } },
{ "multi": true }
)
对于较新的MongoDB版本3.2.X
,您可以使用 updateMany()
方法根据上面的过滤器更新集合中的多个文档。
答案 1 :(得分:3)
位置操作符需要匹配,来自更新查询的匹配部分。
例如:
db.spaces.update({ "attributes.name": "x" }, { $set: { "attributes.0.weight": 2 } }, {multi: true})
这里更新操作的第一个参数将匹配数组attributes
,其中任何元素都具有属性name=="x"
,对于匹配条件的任何元素,可以使用位置运算符来更新它。
所以,因为name='x'
,在这种情况下,第一个匹配元素是
{
"name" : "x",
"color" : "0xd79c9c",
"_id" : ObjectId("5742be02289512cf98bf63e8")
},
它会更新。
现在,根据您的问题,我了解您要更新文档的方式是,在每个文档中,您的第一个元素attribute
获取weight=2
的新值。
db.spaces.update({ "attributes.name": { $regex: /^(?=[\S\s]{10,8000})[\S\s]*$/ } }, { $set: { "attributes.0.weight": 2 } }, {multi: true})
我们在这里做的是匹配数组属性中的所有元素。我们使用位置运算符来更新该数组的第一个元素