我正在尝试实现$ 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部分效果很好。 item
和interval
是猫鼬模型对象。
答案 0 :(得分:2)
从documentation of $addToSet
:“只有当值不在数组中时才向数组添加值”
但是什么是“价值”?在这种情况下,它是整个对象,因为这是您尝试添加到数组的值。但是,对象不是等效的,因为您首先添加的对象已经增加count
,而待添加的对象则没有。因此,它们在所有字段中都没有相同的值,MongoDB并不认为它们是“相等的”。
请记住_id
不是嵌入式数组中的特殊字段,也没有其他语义。