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”的警报。

4

1 回答 1

5

您可能可以使用位置运算符来识别数组元素:

$ 位置运算符

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

所以也许是这样的:

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

但正如 Sergio 指出的那样,根据您问题中的有限信息,很难梳理出文档的结构。


我回答后似乎有更多信息出现,它看起来像:

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

是你需要的。而且您需要:matches在查询中$包含一些内容以供参考。

于 2012-05-08T21:48:50.477 回答