$ addToSet就像$ push一样

时间:2014-01-09 04:46:40

标签: mongodb

我正在尝试实现$ addToSet和$ inc的典型组合,但由于一些奇怪的原因,$ addToSet添加了多个具有相同id的记录(像$ push一样工作):

{ _id: 52ce27691cb76b5a60cc11f7,
  news: 
   [ { _id: 52ce2769c2f35d3d21000018,
       count: 2,
       item: 52ce2769c2f35d3d21000017 },
     { item: 52ce2769c2f35d3d21000017,
       _id: 52ce2769c2f35d3d21000019 } ] }

以下是代码:

        this.update({ _id : interval._id },
            { $addToSet : { news : { item : item } } },
            function (err) {
                if (err) {
                    callback(err);
                    return;
                }

                this.update({ _id : interval._id, 'news.item' : item },
                    { $inc : { 'news.$.count' : 1 } },
                    callback);
            }.bind(this));

此代码被调用两次,因此创建了两个项目:52ce2769c2f35d3d21000017。 $ inc部分效果很好。 iteminterval是猫鼬模型对象。

1 个答案:

答案 0 :(得分:2)

documentation of $addToSet:“只有当值不在数组中时才向数组添加值”

但是什么是“价值”?在这种情况下,它是整个对象,因为这是您尝试添加到数组的值。但是,对象不是等效的,因为您首先添加的对象已经增加count,而待添加的对象则没有。因此,它们在所有字段中都没有相同的值,MongoDB并不认为它们是“相等的”。

请记住_id不是嵌入式数组中的特殊字段,也没有其他语义。