MongoDb:$ push / $ addtoset之间的区别


74

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

对我来说在视觉上是一样的,我不知道区别。

谁能解释我的区别?

另一个人认为如果是西班牙语或简单的英语,我会予以保留。


4
$push从不对数组进行排序。既$push$addToSet新元素添加到目标阵列上的端部。
Leonid Beschastny 2014年

Answers:


125

$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: {items:2}}); // this will update the document. new document {_id: "docId", items:[1,2,2]}

感谢您的解释,我现在在做另一个示例,这次我知道的更多了。
EmilioLópez2014年

同样,$addToSet不影响现有的重复元素。
Deepak Sah

24

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

$ addToSet-仅添加唯一的项目,但不能保证项目的顺序。

如果需要按顺序添加唯一项,则可以通过$ addToSet分组和添加元素,然后用元素对数组进行$ unwind,按项对$ sort进行排序,然后对$ push项再次进行$ group。


2

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


2

除了别人提到的差异

  • $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',
  }}
)

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


1

$ addToSet和$ push可以做相同的事情,但是$ push会推送任何项,而忽略重复,从而导致冗余。前者只推送唯一的项目,不重复。


0

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

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

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

db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.