Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDb:$push/$addtoset之间的差异_Mongodb - Fatal编程技术网

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

MongoDb:$push/$addtoset之间的差异,mongodb,Mongodb,我阅读了MongoDb中的文档,使用了一个简单的证明,我只看到: Push正在对数组进行排序,但不是吗 对我来说视觉上是一样的,我不知道区别 有人能解释一下区别吗 另一个想法是,如果它可以是西班牙语或简单的英语,我会指定它。$addToSet如果已经包含该项,则不要将其添加到给定字段中,另一方面,$push会将给定对象添加到字段中,无论它是否存在 {_id: "docId", items: [1, 2]} db.items.update({_id:"docId&qu

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

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

有人能解释一下区别吗


另一个想法是,如果它可以是西班牙语或简单的英语,我会指定它。

$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做的是相同的事情,但是$push只推送任何项目,而忽略了导致冗余的复制。前者只推送唯一的项目,没有重复。

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

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

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


如果需要按顺序添加唯一项,可以通过$addToSet对元素进行分组和添加,然后$unwind the array with elements、$sort by items,然后再次使用$push items进行$group。

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

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


除了其他人提到的差异之外

  • $push
    :将对象附加到数组
  • $addToSet
    :将不存在的对象添加到数组中
复制是有区别的。(通过查看
local.oplog.rs
,可以看出这一点)

  • $push
    操作(实际修改了数组)被复制为
    $set.items.INDEX:item
  • $addToSet
    操作(实际修改了数组)被复制为
    $set.items:[整个数组]
如果您处理的是大型阵列,那么差异可能会很大

因此,虽然类似(维护独特阵列的典型用例)


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

$push
从不对数组排序。
$push
$addToSet
都会在目标数组的末尾添加新元素。感谢您的解释,现在我正在做另一个示例,这次我知道得更清楚。另外,
$addToSet
不会影响现有的重复元素。
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
db.items.updateOne(
  {_id: 'my-id', 'items': {'$ne': 'items1'},
  {'$push': {
    'items': 'item1',
  }}
)

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