2016-08-05 64 views
3

我正在使用MongoDB批量操作來插入文檔。MongoDB批量操作符,如果不存在則插入

我想要做的是插入,只要沒有找到文件 - 我不想更新,如果它被發現(即,upsert)。

任何想法如何做到這一點?

然而,即使在這種情況下:

var obj = { 
item: 'test' 
} 

bulk.find({ item: {$ne : obj.item}}).upsert().updateOne(obj); 
bulk.execute(); 

這似乎並不實際插入任何東西,如果沒有找到。

編輯:

我想更新此澄清多一點。

我試圖執行兩個操作,使用批量API,一個是更新,一個是插入。

文件看起來是這樣的:

{ 
    item: 'test', 
    categories: [{ 
    name: 'one', 
    attr: 'two' 
    }] 
} 

我想要做的是,如果沒有找到該項目的值,然後將OBJ。但是,如果找到,那麼如果categories.name未找到,$push類別對象爲categories數組。如果找到文檔並且存在類別,則不要執行任何操作。從official doc

db.collection.update(query, update, {upsert: true}) 

例:

回答

0

你可以做到這一點

db.people.update(
    { name: "Andy" }, 
    { 
     name: "Andy", 
     rating: 1, 
     score: 1 
    }, 
    { upsert: true } 
) 
6

什麼你想要的是保持相同的更新操作,但更改查詢。從documentation

Bulk.find(<query>).upsert().update(<update>); Bulk.find(<query>).upsert().updateOne(<update>); Bulk.find(<query>).upsert().replaceOne(<replacement>);

設置爲true的更新插入選項,如果用於Bulk.find()條件不存在匹配的文件,然後更新或替換操作執行插。如果存在匹配的文檔,則更新或替換操作將執行指定的更新或替換。

更改查詢來尋找滿足條件的文件:

var obj = { item: 'test' }; 

bulk.find(obj).upsert().updateOne({ $setOnInsert: obj }); 
bulk.execute(); 

在上面,如果匹配的文件確實存在,然後用$setOnInsert什麼也不做的更新操作不更新導致插入,找到與查詢匹配的文檔。

+0

感謝您的回覆。我已經更新了我的問題以澄清更多。我試着去做你正在說的話,但我並不完全去那裏。非常感謝您的幫助。 – dzm

+0

爲什麼ON EARTH有一個'.upsert()'?有時我想知道開發者如何設法藐視常識。直覺上,它不應該是'.updateOne({$ setOnInsert:obj},{upsert:true})'?一切都是一致的,除非總會有一件事讓開發人員的生活變得可怕。 – Rexford