2013-11-26 43 views
0

採集:tags陣列的如何更新Mongodb中的原始類型數組?

post: 
    title: 'Help' 
    tags: ['mongodb','foo'] 

元素都是唯一的。我想將集合中的所有foo標籤更改爲bar標籤。我可以在一個步驟中使用$set數組中的元素,還是必須從所有標記數組中刪除foo並添加bar s?

回答

1

嘗試此查詢:

db.posts.update({ tags: "foo" }, { $set: { "tags.$": "bar" } }, { multi: true}); 

但如果你tags數組包含多個foo值,這個查詢將取代只是其中的

+0

因此,如果元素數量爲N,那麼爲了實現OP所需的操作,需要對服務器運行N + 1個命令。 –

+0

是的,如果在一個「標籤」數組中有N個「foo」值,那麼這是真的。但據我所知,OP想要更新所有帖子集合而不是某個數組。 – Shad

1

您目前無法通過一個查詢來執行此操作。一種合理的方式實現這一目標將是使用$拉和$推這樣的:

db.a.update({ 
    tags : 'foo' 
    },{ 
    $pull : {tags : 'foo'}, 
    $push : {tags : 'bar'} 
    },{ 
    multi : true 
}) 

但這最終會不允許使用修改錯誤消息字段名稱重複這基本上是告訴你,你不能同時使用$ pull和$ push。 Jira ticket was filed幾年前,但它仍然沒有得到解決(並且基於未成年人標籤在這裏是不太可能得到解決)。

一個去用它的方法是運行一個查詢,發現有foo文件的標識,並通過另一個查詢刪除所有這些foo,另一個插入bars所有的ID。我知道可能在這些更新之間可以修改集合,但這是一種選擇。

另一種方法是遍歷所有標籤爲foo和modify them in foreach statement的元素。