我阅读了MongoDb中的文档,并使用了一个简单的证明,但我只看到:Push正在对数组进行排序,但addtoSet
不是。
对我来说在视觉上是一样的,我不知道区别。
谁能解释我的区别?
另一个人认为如果是西班牙语或简单的英语,我会予以保留。
我阅读了MongoDb中的文档,并使用了一个简单的证明,但我只看到:Push正在对数组进行排序,但addtoSet
不是。
对我来说在视觉上是一样的,我不知道区别。
谁能解释我的区别?
另一个人认为如果是西班牙语或简单的英语,我会予以保留。
Answers:
$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]}
$addToSet
不影响现有的重复元素。
$ push-按接收顺序添加项目。您也可以多次添加相同的项目。
$ addToSet-仅添加唯一的项目,但不能保证项目的顺序。
如果需要按顺序添加唯一项,则可以通过$ addToSet分组和添加元素,然后用元素对数组进行$ unwind,按项对$ sort进行排序,然后对$ push项再次进行$ group。
除了别人提到的差异
$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',
}}
)
最终可能会得到相同的结果文档,复制操作有所不同。
$push
从不对数组进行排序。既$push
与$addToSet
新元素添加到目标阵列上的端部。