在MongoDB中更新单个嵌入式文档中的单个字段

3

我们有一些嵌入式文档,看起来像这样:

 {
"_id" : ObjectId("4e402353bc9f6ec5a6000001"),
"first_name" : "Chris",
"last_name" : "Jones",

    "alerts" : [
    {
        "_id" : ObjectId("4f7cd6ffc067db00070022d4"),
        "name" : "Default",
        "email_frequency" : "weekly",
        "interested_industries" : [
            "Computer Software",
            "Internet"
        ],
        "interested_employers" : [
            "Facebook",
            "AOL"
        ],
        "interested_skills" : [ ],
        "matches" : [
            ObjectId("4ee46a2a0dd0c70017000365"),
            ObjectId("4efa1707bacfa40001012b65"),
            ObjectId("4e402376bc9f6ec5a6000a7a"),
            ObjectId("4e4e0eb8d052fc4028021f66"),
            ObjectId("4ee55d8500ca410014000003"),
            ObjectId("4ee63d06d96b850001008688"),
            ObjectId("4e57be7ed052fc606a002335"),
            ObjectId("4f05d47d9ce340001702ba42"),
            ObjectId("4f200ffcaf5f34000e0021a4"),
            ObjectId("4e4de701d052fc33da00052f")
        ],
        "updated_at" : ISODate("2012-05-03T18:26:14.774Z")
    }
]
 }

由于上述文件包含在数组中,我很难通过类似下面这样的选择器来挑选出它:

User.collection.update({"_id" => user.id}, {:$set => {"alert.matches" => matches}})

但这将更新所有 #alerts 匹配的内容。我只想更新具有 ID“4fa7fd60e5be08bcc9000644”的警报。

最好发布精确的JSON文档。 - Sergio Tulentsev
这是关于Ruby驱动程序实现的内容,JSON并不相关。 - user577808
嗯,我不确定我在这里看到了什么。如果人们不能帮助你,那就变得相关了 :) - Sergio Tulentsev
1个回答

5

您可以使用位置操作符来识别数组元素:

$ 位置操作符

$操作符(本身)表示“查询中匹配的数组项的位置”。使用它来查找数组成员然后对其进行操作。

因此,可能会有这样的情况:

User.collection.update(
    { :_id => user.id, :matches => BSON::ObjectId('4e40238dbc9f6ec5a6000eed') },
    { :$set => { 'alert.matches.$' => matches } }
)

但正如Sergio所指出的那样,根据您提供的有限信息,很难解析出您文档的结构。


看起来在我回答后又有了更多信息,它看起来是:

{ :$set => { 'alerts.$.matches' => ... } }

这是您需要的。并且您需要在查询中包含:matches,以便$有可指称的内容。


刚刚添加了文档的结构。 - user577808
这意味着我必须在“alerts._id”上有一个索引,对吗?此外,位置操作符是否取决于选择器?例如,如果我的选择器是{"_id" => user.id},那么位置操作符将无法正常工作,对吗? - user577808
@user577808:你不需要索引。如果在搜索中不包括数组,则 $ 就没有任何东西可供参考。我提供的文档链接中有更多关于位置操作符的信息:http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator - mu is too short
@AsyaKamsky:那里是不是多了一个回车?看起来你的评论被截断了。 - mu is too short
是的,我决定删除评论并点赞答案。 :) - Asya Kamsky
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接