仅将唯一添加到数组并在更新时保留字段数

时间:2016-03-20 21:30:30

标签: mongodb mongodb-query

我在一个集合中存储了一个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
}

谢谢!

1 个答案:

答案 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情况也是如此,其中元素不存在于数组中。