2016-10-08 71 views
0

主要目標是:插入一次爲多個文件,但確保只有那些獨特的存儲在集合解釋如下集插入多 - 確保其唯一性

我將許多文件到MongoDB中收集一次像這樣:

db.users.insert([{name: 'Joe'}{'name': 'Bob'}]); 

進入插入的一些值可能是重複的,我希望MongoDB忽略這些值。這是爲了確保集合內的唯一性。

db.users.insert([{name: 'Joe'}{'name': 'Jack'}]); 

使用索引整個.insert()操作,如果整個插入不是唯一的,而不是被忽略只非獨特的項目會失敗。

db.users.createIndex({ 'name': 1 }, { unique: true }); 

日誌從MongoDB的:

BulkWriteResult({ 
    "writeErrors" : [ 
     { 
      "index" : 0, 
      "code" : 11000, 
      "errmsg" : "E11000 duplicate key error collection: test.users index: name_1 dup key: { : \"Joe\" }", 
      "op" : { 
       "_id" : ObjectId("57f924ee7d864acfefaca700"), 
       "name" : "joe" 
      } 
     } 
    ], 
    "writeConcernErrors" : [ ], 
    "nInserted" : 0, 
    "nUpserted" : 0, 
    "nMatched" : 0, 
    "nModified" : 0, 
    "nRemoved" : 0, 
    "upserted" : [ ] 
}) 

是否有這樣做的另一種方式?

+0

你真正想要什麼?請你詳細說明它更 –

+0

@WasiqMuhammad我認爲問題是很清楚......我想在一次插入多個文件,但確保只有那些獨特的存儲收藏。添加到問題帖子 – Monokh

回答

0

對於人們在尋找一個答案。我最終使用批量update.upsert()操作。這意味着我可以保留我的上限收集品,確保它是有序的,整個操作仍然是散裝。

這除去唯一索引的需要,因爲upsert總是更新/插入數據以確保我們沒有重複。 查找操作應包含唯一鍵。

const bulk = db.collection.initializeOrderedBulkOp(); 
bulk.find({name: 'Joe'}).upsert().updateOne({name: 'Joe'}); 
bulk.find({name: 'Bob'}).upsert().updateOne({name: 'Bob'}); 
bulk.find({name: 'Jack'}).upsert().updateOne({name: 'Jack'}); 
bulk.execute(); 
0

忘了評論。也許你正在尋找這樣的東西。 UnorderedBulkOp

魔術從無序批量操作卡梅斯並行發生。如果其中一個(或某些)發生故障,MongoDB將繼續處理其餘事件,並最終發出錯誤消息。

+0

我有一個特定的集合是一個封頂的集合,所以實際上這對操作命令很重要:(查看文檔,雖然它似乎我可以只使用有序批量操作呢? – Monokh

+0

實際上,這不會我現在看到爲什麼你在這裏推薦Unordered批量操作......'如果在處理其中一個寫操作時發生錯誤,MongoDB將返回而不處理列表中剩餘的任何寫入操作。'也許唯一的方法是插入一個接一個,然後 – Monokh

0

了插入多個文件與一些獨特的鍵,你可以創建一個索引,在那裏你可以聲明鍵是唯一的。 像你的情況,你可以創建使用此命令指數,

db.users.createIndex({ 「名」:1},{獨特:真正})

+0

這條線是從字面上的職位......我已經這樣做 – Monokh