2016-11-22 6 views
1

$addToSetを使用すると、これを2回実行すると重複オブジェクトが入力されますが、namekeyが逆の順序です。それはこれを避けるようにとにかくあるので、それは1つだけ時間を追加するでしょうか?

var categories = [{ 
    name: 'One', 
    key: 'one' 
}] 

User.update({_id : id}, {$addToSet : {'items' : {$each : categories }}}); 
+0

idの値は何ですか?これは毎回変わるのですか?定数に設定してみてください。同じ効果がありますか? – Brett

+0

ええ、それは文字通り文字列として同じです。同じ2つのオブジェクトはitems配列内にあり、名前/キー 'keys'は逆の順序です。 – dzm

+0

更新機能はUser.update({_ id: 'one'}、{$ addToSet:{'items':{$ each:categories}}})に評価されます。 ? – Brett

答えて

1

$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 }}}); 
関連する問題