2016-03-20 46 views
1

我在一個集合中存儲一個item(stringId)的數組。此數組中的所有元素必須是唯一的。所以我使用$ addToSet來推送我的物品。添加唯一到陣列並保持字段計數更新

但是,我也想在相同的請求來設置我的陣列中的場的尺寸:

{ 
    unique_array: ['12', '20', '18'], 
    size_of_array: 3 
} 

=>添加到組15

{ 
    unique_array: ['12', '20', '18', '15'], => Add to set 
    size_of_array: 4 => Incremented 
} 

=>添加到設置18

{ 
    unique_array: ['12', '20', '18', '15'], => Already in the set 
    size_of_array: 4 => Not incremented 
} 

謝謝!

回答

2

對於這種類型的操作,你不應該使用$addToSet因爲當然$inc會不管什麼是否被添加到陣列(「設置」)或不發生。

相反,測試與$ne運營商在查詢中的數組:

db.collection.update(
    { "unique_array": { "$ne": 18 } }, <-- existing element 
    { 
     "$push": { "unique_array": 18 }, 
     "$inc": { "size_of_array": 1 } 
    } 
) 

這同樣適用於去除數組成員,當然你測試與平等存在這個時間:

db.collection.update(
    { "unique_array": 18 }, <-- existing element 
    { 
     "$pull": { "unique_array": 18 }, 
     "$inc": { "size_of_array": -1 } 
    } 
) 

由於查詢條件需要匹配,如果數組元素在添加時已經存在,則不存在匹配,並且運行$push$inc操作。 $pull這個元素不在數組中的情況也是如此。

+0

完美。謝謝。 – jeremieca

相關問題