0

これが回答されている場合は申し訳ありませんが、このサイトで私のニーズに合った他の質問を得ることができず、さらに重要なことに、うまくいきません.

「住所」のサブドキュメントを含む以下のサンプルドキュメントがあります。

{ 
    "_id" : ObjectId("....")
    ,"addresses" : 
        [{
            "start" : ISODate("1973-07-10T00:11:51.111Z")
            ,"value" : "123 long road"
        }] 
}

私がしなければならないことは、既存の住所レコードを属性で閉じて、新しい住所にend新しい属性を持つ新しい行を追加することです。最終的には、コードが存在しないサブドキュメント レコードを更新する必要があるため、これをもう一度行う必要があります。startvalueend

以下のコードは機能しませんが、私が得ることができる限りです:

db.sites.update(
      {"_id" : ObjectId("....")
        , "addresses.end" : {"$exists" : false}}
     ,{"$set": {"addresses.$.end" : "fdsa"}});

これにより、次のエラーが発生します。

Cannot apply the positional operator without a corresponding query field containing an array.

誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

2

クエリ"addresses.end" : {"$exists" : false}を次のように置き換えます。

addresses: {$elemMatch: {end: {$exists: false}}}
于 2014-08-04T14:19:48.680 に答える
0

住所フィールドの定義が不十分です。サブドキュメントまたはサブドキュメントの配列にする必要があります。ie { "_id" : ObjectId("....") ,"addresses" : [ { "start" : ISODate("1973-07-10T00:11:51.111Z") ,"value" : "123 長い道のり" } ] }

その後、クエリが機能するはずです。

于 2014-08-04T14:20:45.660 に答える