使用$addToSet
时,如果我运行两次,它会输入重复的对象,但name
和key
的顺序相反。反正有没有这个避免这个,所以它只会增加一次?
var categories = [{
name: 'One',
key: 'one'
}]
User.update({_id : id}, {$addToSet : {'items' : {$each : categories }}});
答案 0 :(得分:3)
看起来$addToSet
与对象完全匹配,包括属性的顺序。 $addToSet
运算符无法识别属性是否为任意顺序(如OP中所述)。
但是,当属性的顺序不相同时,$elemMatch
工作正常(即,它可以发现嵌入的文档已在数组中可用)。因此,解决方法的解决方案是使用$elemMatch
和$not
来检查数组中是否存在值,如果不存在则更新。
var categories = [{
key: 'one',
name: 'One'
}]
db.collection.update({"_id" : ObjectId("5834bd23ba41f1f22e600c7d"), "items" : {$not : {$elemMatch : categories[0]}}}, {$addToSet : {'items' : {$each : categories }}});