2013-08-23 50 views
3

從所有的子文檔的字段我有成千上萬的文件格式爲:的MongoDB:刪除陣列中的場

{ 
"_id" : ObjectId("51e98d196b01c2085c72d731"), 
"messages" : [ 
    { 
     "_id" : ObjectId("520167056b01c20bb9eee987"), 
     "id" : ObjectId("520167056b01c20bb9eee987"), 

    }, 
    { 
     "_id" : ObjectId("520167056b01c20bb9eee988"), 
     "id" : ObjectId("520167056b01c20bb9eee988"), 

    }, 
    { 
     "_id" : ObjectId("520167056b01c20bb9eee989"), 
     "id" : ObjectId("520167056b01c20bb9eee989"), 
    } 
], 
} 

我需要刪除重複的「ID」字段。這是我曾嘗試:

db.forum_threads.update({}, {$unset: {"messages.$.id": 1}}, {multi: true}); 

這是我收到的錯誤:

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

回答

10

你得到這個錯誤的原因是因爲你沒有過濾器子句中的任何謂語。你可以這樣做:

mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true}) 

而且你不會得到一個錯誤 - 事實上的文件之一將有id屬性中刪除。問題是位置運算符只匹配匹配謂詞的數組的FIRST元素,它不匹配所有元素。更大的問題是,目前無法更新MongoDB中的數組中的所有元素(https://jira.mongodb.org/browse/SERVER-1243)。

您可能需要使用數字位置(「messages.0.id」,「messages.1.id」等)遍歷數組中的每個元素,或者可以將數組拖到應用程序中,遍歷元素並更新它們,然後將該數組保存回去。

從JIRA票據可以看出,這個問題已經開放了很長時間,但10gen似乎並不認爲它是非常重要的。

+0

我有預感這是不可能的。猜猜我必須去替代路線,謝謝! – user1236803

+0

感謝您的解釋,我錯過了「。$」。在$ unset子句中。這是意想不到的行爲,它只從它遇到的第一個子目錄中刪除屬性,但這仍然有助於捏,我只是多次運行它,直到我將它們全部刪除。 – SteveO7