2012-03-09 74 views
12

當前爲我的項目拖出Mongoose和MongoDB,但遇到API不明確的段。Mongoose中的唯一數組值

我有一個模型,其中包含幾個鍵和文檔,其中一個鍵稱爲watchList。這是用戶正在觀看的一組ID,但我需要確保這些值保持唯一。

下面是一些示例代碼:

var MyObject = new Mongoose.Schema({ 
    //.... 
    watching : {type: Array, required: false}, 
    //.... 
}); 

所以我的問題是我怎麼能確保該值推入陣列永遠只能存儲一個,所以使得價值獨特,可我只是使用unique: true

謝謝

回答

14

據我所知,在貓鼬這樣做的唯一方法是調用底層的Mongo運算符(mentioned by danmactough)。在貓鼬,那會是這樣的:

var idToUpdate, theIdToAdd; /* set elsewhere */ 
Model.update({ _id: idToUpdate }, 
      { $addToSet: { theModelsArray: theIdToAdd } }, 
      function(err) { /*...*/ } 
); 

注:此功能需要獴版本> = 2.2.2

+3

can * theIdToAdd *是一個數組,例如'[「ID1」,「ID2」]'? – RobertPitt 2012-03-14 18:53:15

+2

我想你可以使用$每個。 – 2012-03-16 15:45:56

+2

@RoberPitt優點... theIdToAdd不能是一個數組。如果你這樣做,要插入的項目將是該數組。我試圖找到一種方法來解決這個問題:-( – superiggy 2013-02-16 06:15:28

6
+0

所以,$ addToSet會在數組中添加一個新的元素,如果它已經不包含重複的話。有沒有一種方法(例如創建一個唯一的索引),這將確保從不在數組中重複?基本上,我想要一個Set而不是一個Sequence。 – 2012-03-16 15:45:06

1

貓鼬是MongoDB的對象模型,這樣一個選擇是把文檔作爲正常的JavaScript對象。

MyModel.exec(function (err, model) { 
    if(model.watching.indexOf(watchId) !== -1) model.watching.push(watchId); 

    model.save(...callback); 
}); 

雖然,我不同意,貓鼬應該有這個內置的collection document reference feature驗證程序的形式,一些支持 - 尤其是因爲大多數的時候你要只添加獨特的引用。

+2

This won如果這個集合是通過併發操作添加到模型中的,那麼你就不會工作,在你的例子中,你將檢查這個集合是否存在於一個陳舊的模型副本中,因此需要一個強制的數據庫級別唯一索引。 – ninja123 2014-04-02 13:49:50