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」で1つのアラートを更新したいだけです。

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 に答える