2013-03-17 15 views
0

貓鼬的最快方式是確定元素是否已經在數組中。在這種情況下,我想從該數組中刪除該元素。在數組不包含特定元素的情況下,我想添加它。mongoose - 如果不在數組中,則將其添加,如果已在數組中,請將其刪除

當然可以使用addToSet和remove(_id)來添加和刪除。查詢也沒有問題。我真的更關心以最短的方式來做到這一點,用更少的努力。

例如,我建議採取架構:

var StackSchema = new Schema({ 
    references: [{ type: Schema.Types.ObjectId, ref: 'Person' }] 
}); 

比方說,引用數組包含的元素:

['5146014632B69A212E000001', 
'5146014632B69A212E000002', 
'5146014632B69A212E000003'] 

案例1:我的方法接收5146014632B69A212E000002 (所以此項應被刪除。)

案例2:我的方法收到5146014632B69A212E000004(所以這個條目應該被添加。)

回答

0

下面是邏輯,代碼如下。

我通常使用underscore.js來完成這樣的任務,但是你可以用JavaScript來完成。

  1. 取文件。
  2. 遍歷文檔中的_ids,執行真值測試。
  3. 如果文檔包含您正在測試的_id,請從數組中刪除當前索引。
  4. 如果你已經經歷了整個陣列,並且沒有任何內容,array.push() _id。然後document.save()

這就是我通常遵循的方法。

在下劃線,它會去是這樣的:

function matching(a,b) { // a should be your _id, and b the array/document 
    var i; 
    for (i = 0, i < b.length , i++) { 
    if (a.toString() === b[i].toString()) 
     return i; 
    else return -1; 
    } 
}; 

然後你會這樣使用函數:

var index = matching('5146014632B69A212E000002', doc); 
if (index > -1) 
    doc.splice(index , 1); 
else 
    doc.push('5146014632B69A212E000002'); 
1

的解決方案,任何人經過。 :)

if(doc.references.indexOf(SOMESTRING) !== -1) { 
    console.log('it\'s there') ; doc.likes.pull(SOMESTRING); 
}else{ 
    doc.references.push(SOMESTRING); 
} 
相關問題