我阅读了MongoDb中的文档,我使用了一个简单的证明,我只看到:
Push正在排序数组,但addtoSet
不是。
对于我来说,视觉上是一样的,我不知道其中的差异。
有人可以解释我的区别吗?
另一个人认为,如果它可能是西班牙语或简单的英语,我会对它有所了解。
答案 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',
}}
)
最终可能会得到相同的结果文档,复制操作有所不同。