2016-03-22 30 views
0

我有MongoDB的$問題設置& $ -operators。我嘗試修改現有陣列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" : [] 
} 

所以,我希望它做的是修改文件的channelStatuses對象的狀態與_id = 2

相反,它創建了陳蔭羆內的新對象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"}"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" 
     } 
    ] 
}