我尝试在文档的数组中找到一个对象,并更新其字段。
db.rescuemodels.findAndModify({
query: {
"features": {
$elemMatch: {
"properties.title": "W"
}
}
},
update: {
$set: {
"features": {
"properties": {
"title": "XXX"
}
}
}
}
})
查询很好,结果是一个匹配元素,但是如何使更新方法只更改此示例title
中的一个字段?因为现在它创建了新的数组或对象并清理了旧数组。
答案 0 :(得分:4)
为此,MongoDB有"Dot Notation",以及用于引用数组匹配元素的positional $
运算符:
db.rescuemodels.findAndModify({
"query": { "features.properties.title":"W" },
"update": { "$set": { "features.$.properties.title":"XXX" } }
})
请注意,这仅在存在单个数组时才有效:
{
"features": [
{ "properties": { "name": "A" } },
{ "properties": { "name": "W" } }
}
}
如果你是嵌套数组,那么MongoDB只能在“外部”数组之外的“位置运算符”中匹配:
{
"features": [
{ "properties": [{ "name": "A" }, { "name": "W" }] },
]
}
位置匹配在那里不起作用,因为你不能做features.$.properties.$.name
,匹配的元素索引将是0
而不是1
,因为它指的是外部数组。
另请注意,在nodejs下,.findAndModify()
的MongoDB驱动程序语法与shell语法完全不同。 “查询”和“更新”部分是单独的参数,而不是shell使用的文档形式,
答案 1 :(得分:1)
要更新数组“features”中的单个元素,可以使用位置运算符$。您的查询看起来像这样......
db.rescuemodels.findAndModify({
query: {
"features": {
$elemMatch: {
"properties.title": "W"
}
}
},
update: {
$set: {
"features.$.properties.title": "XXX"
}
}
})