MongoDb:$ push / $ addtoset之间的差异

时间:2014-12-02 11:41:54

标签: mongodb

我阅读了MongoDb中的文档,我使用了一个简单的证明,我只看到: Push正在排序数组,但addtoSet不是。

对于我来说,视觉上是一样的,我不知道其中的差异。

有人可以解释我的区别吗?

另一个人认为,如果它可能是西班牙语或简单的英语,我会对它有所了解。

6 个答案:

答案 0 :(得分:99)

$addToSet如果项已经包含它,则不会将该项添加到给定字段,另一方面$push会将给定对象添加到字段中是否存在。

{_id: "docId", items: [1, 2]}
db.items.update({_id:"docId"}, {$addToSet:{items: 2}}); // This won't update the document as it already contains 2
db.items.update({_id:"docId"}, {$push: {item:2}}); // this will update the document. new document {_id: "docId", items:[1,2,2]}

答案 1 :(得分:15)

$ push - 按照收到的顺序添加商品。您也可以多次添加相同的项目

$ addToSet - 只添加唯一商品,但商品订单不受保证

如果您需要添加订购的唯一商品,您可以通过$ addToSet分组和添加元素,然后使用元素$ unwind数组,按项目排序$ sort,然后使用$ push items再次$ group。

答案 2 :(得分:1)

$ addToSet和$ push做同样的事情,但$ push只是推送任何项目而忽略重复导致冗余。前者仅推送独特的项目,没有重复。

答案 3 :(得分:1)

顾名思义$ addToSet(set)不允许重复 而$ push只是将元素添加到数组

答案 4 :(得分:0)

$ push:将值插入结果文档中的数组。 例如;

db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])

$ addToSet:将值插入结果文档中的数组,但不创建重复项。 例如;

db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])

答案 5 :(得分:0)

沿着别人提到的差异

  • $push:将对象追加到数组
  • $addToSet:如果对象不存在,则将其添加到数组中

复制之间存在差异。 (这可以通过查看local.oplog.rs来看到)

  • $push操作(实际上修改了数组)被复制为$set.items.INDEX: item
  • $addToSet操作(实际上修改了数组)被复制为$set.items: [THE_ENTIRE_ARRAY]

如果要处理大型数组,则差异可能会很大

所以,类似的东西(维护唯一数组的典型用例)

db.items.updateOne(
  {_id: 'my-id', 'items': {'$ne': 'items1'},
  {'$push': {
    'items': 'item1',
  }}
)

db.items.updateOne(
  {_id: 'my-id'},
  {'$addToSet': {
    'items': 'item1',
  }}
)

最终可能会得到相同的结果文档,复制操作有所不同。