findAndModify,如何对文档的数组搜索对象进行操作并更改字段值

时间:2015-03-04 01:13:13

标签: javascript mongodb mongodb-query

我尝试在文档的数组中找到一个对象,并更新其字段。

db.rescuemodels.findAndModify({
    query: {
        "features": {
            $elemMatch: {
                "properties.title": "W"
            }
        }
    },
    update: {
        $set: {
            "features": {
                "properties": {
                    "title": "XXX"
                }
            }
        }
    }
})

查询很好,结果是一个匹配元素,但是如何使更新方法只更改此示例title中的一个字段?因为现在它创建了新的数组或对象并清理了旧数组。

2 个答案:

答案 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"
        }
    }
})