2016-12-16 45 views
4

我有這樣的文檔。如何保持基於特定字段陣列的唯一性未使用唯一索引

[{ 
    "_id" : ObjectId("aaa"), 
    "host": "host1", 
    "artData": [ 
    { 
     "aid": "56004721", 
     "accessMin": NumberLong(1481862180 
    }, 
    { 
     "aid": "56010082", 
     "accessMin": NumberLong(1481861880) 
    }, 
    { 
     "aid": "55998802", 
     "accessMin": NumberLong(1481861880) 
    } 
    ] 
}, 
{ 
    "_id" : ObjectId("bbb"), 
    "host": "host2", 
    "artData": [ 
    { 
     "aid": "55922560", 
     "accessMin": NumberLong(1481862000) 
    }, 
    { 
     "aid": "55922558", 
     "accessMin": NumberLong(1481861880) 
    }, 
    { 
     "aid": "55940094", 
     "accessMin": NumberLong(1481861760) 
    } 
    ] 
}] 

而更新任何文件,重複的「援助」不應該在陣列中再次添加。 我得到的一個選擇是使用artData.aid字段上的唯一索引。但建設指數不是首選,因爲我不需要按照要求。 有什麼辦法可以解決這個問題嗎?

+0

有你看看這個 ** [$ addToSet](https://docs.mongodb.com/v3.2/reference/operator/update/addToSet/)** – Yogesh

+0

@Yogesh不適用於添加子文檔 – Belfordz

回答

0

按照this doc,您可以使用多鍵指標如下:

{ "artData.aid": 1 } 

話雖這麼說,因爲你要使用多鍵索引,以便插入另一個選擇是

  1. 查詢文檔以查找與aid相匹配的文件artData's
  2. 與您即將插入的集合的結果集不同
  3. 刪除您搜索
  4. 從第2步

插入剩餘的項目在理想情況下,從第1步查詢不會返回一組過大的項目 - 使這是一個令人驚訝的快速操作。這就是說,它的確基於你假設你將要插入的重複數量。如果數字確實很高,則步驟1中的查詢結果可能會返回一大組項目,在這種情況下,此解決方案可能並不合適,但它爲我提供的所有內容=(。

我的建議是要真正重新評估不使用多鍵索引的原因

+0

Thanx的答覆。但我已經提到,我不需要在該領域的指數。由於數據非常龐大,也不是必需的。 – chopra

+0

更新一次,我重新讀你的問題。 – Belfordz

+0

這是一個不錯的選擇。但是我擁有數百萬的數據。這將需要很多時間,因爲一次性在大集合上進行更新。 – chopra

3

選項1:在設計模式該文檔使用unique:true 例如:

var newSchema = new Schema({ 
artData: [ 
    { 
     aid: { type: String, unique: true }, 
     accessMin: Number 
    }] 
}); 
module.exports = mongoose.model('newSchema', newSchema); 

選項2:refer a link to avoid duplicate

+0

非常感謝。你可以請分享侯可以設置它使用Java? – chopra

+0

這個答案是特定於貓鼬api的。在這種情況下,mongoose api使用我創建多鍵索引的答案。 – Belfordz