2016-03-22 11 views
0

MongoDB $ set & $オペレータに問題があります。私は既存のアレイに変更しようとMongoDB Bulk.find.update()は配列オブジェクトを変更しないで、新しいオブジェクトを追加するだけです

私の更新方法は、(それはClojureの/屋で書かれているように私には正確なコピーを取得することはできません)このよう程度になります。

bulk.find({ 
      _id: 2, 
      channelStatuses.channel: {$eq: "BAR"} 
    }).update({ 
      $set: {"channelStatuses.$.status": "error" } 
    }); 

私のデータは次のようになります。

{ 
    "_id" : "1", 
    "channelStatuses" : [ 
    { 
     "channel" : "FOO", 
     "status" : "done" 
    } 
    ] 
}, 
{ 
    "_id" : "2", 
    "channelStatuses" : [ 
    { 
     "channel" : "BAR", 
     "status" : "done" 
    } 
    ] 
}, 
{ 
    "_id" : "3", 
    "channelStatuses" : [ 
    { 
     "channel" : "BAZ", 
     "status" : "error" 
    } 
    ] 
}, 
{ 
    "_id" : "3", 
    "channelStatuses" : [] 
} 

それでは、私はそれがやりたいこと= 2

_idで文書のchannelStatusesオブジェクトの状態を変更することである代わりに、それはchann内に新しいオブジェクトを作成しますelStatuses配列であり、ドキュメントは次のようになります。

{ 
     "_id" : "2", 
     "channelStatuses" : [ 
     { 
      "channel" : "BAR", 
      "status" : "done" 
     }, 
     { 
      "channel" : "BAR", 
      "status" : "" 
     } 
     ] 
    }, 

答えて

2

私はあなたの質問にいくつかの問題を発見しました。

  1. 文書では、_idフィールドはテキスト値ですが、クエリでは数値と​​して使用しています。

  2. channelStatuses.channel: {$eq: "BAR"}は無効です。二重引用符でエスケープしない限り、JSONキーには.を含めることはできません。

  3. あなたは今、次のクエリを試してみて、それが動作するかどうかを確認channelStatuses.channel: {$eq: "BAR"}

  4. "channelStatuses.channel": "BAR"から

を簡素化することができます。

var bulk = db.doc.initializeUnorderedBulkOp(); 

bulk.find({ 
    _id: "2", 
    "channelStatuses.channel": "BAR" 
    }).update({ 
      $set: {"channelStatuses.$.status": "error" } 
    }); 

bulk.execute(); 

既存のフィールドを更新するだけです。以下の最終出力を参照してください。

{ 
    "_id" : "1", 
    "channelStatuses" : [ 
     { 
      "channel" : "FOO", 
      "status" : "done" 
     } 
    ] 
} 
{ 
    "_id" : "2", 
    "channelStatuses" : [ 
     { 
      "channel" : "BAR", 
      "status" : "error" 
     } 
    ] 
} 
{ 
    "_id" : "3", 
    "channelStatuses" : [ 
     { 
      "channel" : "BAZ", 
      "status" : "error" 
     } 
    ] 
} 
関連する問題