2013-07-24 105 views
1

我有api java mongodb的一個大問題。我使用DBCollection類的更新方法的請求,並在MongoDB中,我得到一個多個相同的文件,而價值不變,請幫助我。我不想有一個重複的文件。BasicDBObject更新重複相同的文檔

BasicDBObject query = new BasicDBObject(); 
query.append("ad", "man2ist").append("list.id", new BasicDBObject("$ne", "5")); // "list.id" : {$ne : 0 } 

BasicDBObject a = new BasicDBObject("id",String.valueOf(5)).append("value", 100); 
BasicDBObject upd = new BasicDBObject("$addToSet",new BasicDBObject("list",a)); 
System.out.println(query); 

System.out.println(upd); 

WriteResult r = dbc.update(query,upd,true,false); 

//db.friends.update({ "ad" : "man2ist" , "list.id" : { $ne : "4"} },{ $addToSet : { "list" : { "id" : "4","value" : 100}}},true,true); 

我這裏的文件:

{ 
"ad" : "man2ist", 
"createdDate" : ISODate(), 
"list" : [ 
     { 
       "id" : "45", 
       "value" : 489 
     }, 
     { 
       "id" : "5", 
       "value" : 20, 

     }, 
     { 
       "id" : "4578", 

       "value" : 21, 

     } ]} 
+0

你能解釋一下你想要做什麼以及你的收藏文件是怎麼樣的? – innoSPG

+0

與終端中的mongo shell,這是工作,但與mongo java驅動程序,當我更新文件與upsert選項,我得到一個重複的文件。也許這是java mongo驅動程序中的錯誤,但通常情況並非如此。我想更新我的文件,如果已經存在,我不會創建,但我更新他,如果他不存在我創建他,謝謝。 – jonn

+0

在討論java驅動程序中的錯誤之前(不排除它),你能用簡單的英語來解釋你想要更新哪個文件。我的意思是文件應該滿足要更新的條件。有時候,問題就在於操作者被蒙上了一層薄霧,尤其是當您的操作與一個司機而不是其他司機合作時。 – innoSPG

回答

0

的問題是,你的心煩標誌設置爲true,這意味着如果沒有滿足要求的文檔中發現的文件應該被創建。如果沒有與db中的條件匹配的文檔,那麼mongo shell將執行相同的操作。

如果你改變你的查詢到這一點,

WriteResult r = dbc.update(query,upd,false,false); 

它應該工作的所有時間。

+0

是的,但如果文檔不存在,mongo不會創建。此外,我的搜索條件是正確的,正如您所看到的(「ad」:「man2ist」),但我認爲它不能識別。我想說它與mongo shell完美配合。 – jonn

+0

我已經嘗試過了,即使是mongo shell也會創建一個新的文檔,如果符合條件的文檔不存在的話。根據你的標準,一切都是正確的。也許你應該在空集合中查詢查詢。將集合名稱更改爲不存在的friendstest,然後再次在mongo shell中運行命令以查看。 db.friendstest.update({ad:「man2ist」,「list.id」:{$ ne:「5」}},{$ addToSet:{「list」:{'id':「5」,'value' :100}}},true,false)。之後,收集friendstest將有一個新的文檔。 – innoSPG

+0

如果我在查詢中使用了mongo shell,其中up​​sert選項爲false並且爲空集合,它會爲我創建一個文檔。如果文件存在,它會讓我更新我的數據。通過在Java中,如果我在空集合上重複使用相同的查詢,它不會發生任何反應,我不得不打開upsert選項,但是存在重複文檔的問題。我想我將分兩個階段進行,首先是創建文檔,然後用upsert插入第二個更新並更新爲false。 – jonn