2015-12-09 107 views
1

是否可以執行一個MongoDB查詢,increment嵌套文檔的字段並在文檔不存在時創建嵌套文檔?MongoDB使用upsert增加嵌套文檔

例子:

{ 
    id: ... 
    nestedArray: [ 
    {kind: "foo", times: 10} 
    ] 
} 

讓我們說,我想增加一個字段nestedArray.$.times其中kind: "bar"bar不數組中存在了嗎?因此,在執行查詢後會看起來像

db.mycollection.update({id: "100", nestedArray:{$elemMatch: {kind: "bar"}}}, {$inc: {'nestedArray.$.times': 1}}, {upsert: true}) 

該文件是這樣的:

{ 
    id: ... 
    nestedArray: [ 
    {kind: "foo", times: 10}, 
    {kind: "bar", times: 1} 
    ] 
} 

當然如果整個文件中沒有找到(不只是嵌套一個),一個是自動創建的。

+0

嗨,我想你有同樣的問題:https://jira.mongodb.org/browse/SERVER-3326 –

回答

1

作爲變通,這可以用兩個更新查詢的幫助來實現,

查詢1

db.mycollection.update(
    {id:"400","nestedArray.kind": "bar"}, 
    {$inc: {"nestedArray.$.times":1}} 
) 

這是一個簡單的查詢,並將其用於遞增nestedArray.times值nestedArray.kind是「bar」。如果文件沒有找到,它什麼都不做。

查詢2

此查詢手柄插入新的文件/推入嵌套數組中的情況下爲ID匹配文件是否存在。

db.mycollection.update(
    {id:"400","nestedArray.kind": {$ne:"bar"}}, 
    {$push: {"nestedArray": {kind:"bar","times":1}}}, 
    {upsert:true} 
) 

該查詢在nestedArray.kind沒有bar值的文檔中搜索id。如果找到這樣的文件,{kind:"bar","times":1}被推入nestedArray。如果未找到,則創建一個{kind:"bar","times":1}作爲nestedArray中唯一值的新文檔。