2014-06-05 51 views
1

我有一個方法需要刪除要刪除的對象集合。使用Jongo更新/刪除多個對象

這是我刪除他們現在

public void deleteAll(Collection<Object> objs){ 
    for(Object obj : objs) { 
     collection.remove("{ _id: # }", obj.getId()); 
    } 
} 

我做了更新我在哪裏,通過對象傳遞的集合循環非常類似的方式。這似乎非常耗時。

有更好的方法來做更新/刪除?

+0

做,即使我不熟悉這個庫中的語法的基本概念是使用**'$ in' **使用列表操作。所以,如果你能以某種方式將所有'_id'值「映射」爲列表類型,那麼你應該能夠使用該運算符作爲參數發送。我看到主站點上的[Query](http://jongo.org/#querying)示例下的「Query Templating」部分可能適用於此。 –

+0

謝謝尼爾,這對刪除幫助很大。儘管有更新,但我能夠提取出所有需要更新的文檔,但我仍然不確定如何一次保存所有新文檔。 Jongo的with()和save()方法一次只接受1個對象,不接受對象的集合 – hpkancha

+0

正如我之前說過的,我對Jongo沒有任何經驗,也沒有時間去嘗試出了一些例子,但如果你有一個MongoDB 2.6或更高版本,那麼這個關於[Bulk Update](http://docs.mongodb.org/manual/reference/command/update/#bulk-update)的手冊部分可能是利益。我已經發布了一些關於使用情況的答案,並且應該有一種方法讓您至少從Java驅動程序獲取原始數據庫對象,以便使用所需的'runCommand'版本。或者如果它是最近的版本,可能還有其他由Java驅動程序公開的批量更新API。 –

回答

1

使用單個查詢可以刪除和更新多個文檔。

刪除

您需要使用查詢使用$in選擇,並_id值的陣列相匹配。

隨着Jongo,您如上使用$in選擇的對象可以生成列表,以配合$in到查詢在幾個不同的方式

// pass an array of ids 
ObjectId[] ids = {id1, id2, id3}; 
collection.remove("{ _id: { $in: # } }", ids); 

// or pass each id separately 
collection.remove("{ _id: { $in:[#, #, #] }}", id1, id2, id3); 

更新

完全一樣的概念您要更新,但是您還必須設置multi選項,以便更新適用於它匹配的所有文檔不僅僅是第一次。

隨着Jongo這是像這樣

ObjectId[] ids = {id1, id2, id3}; 
collection 
    .update("{ _id: { $in: # } }", ids) 
    .multi() 
    .with({ $set: { foo: "bar" });