我在一个集合中存储了一个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
}
谢谢!
答案 0 :(得分:2)
对于这种类型的操作,您不应该使用$addToSet
,因为无论是否有任何内容添加到数组(“set”),$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
情况也是如此,其中元素不存在于数组中。