MongoDb: Difference between $push/$addtoset

后端 未结 6 680
迷失自我
迷失自我 2020-12-08 09:06

I read the documentation in the MongoDb and I used a simple proves and I only look that: Push is sorting the array but addtoSet isn\'t it.

For me visual

相关标签:
6条回答
  • 2020-12-08 09:22

    $push: Inserts the value to an array in the resulting document. eg;

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

    $addToSet: Inserts the value to an array in the resulting document but does not create duplicates. eg;

    db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
    
    0 讨论(0)
  • 2020-12-08 09:27

    $push - adds items in the order in which they were received. Also you can add same items several times.

    $addToSet - adds just unique items, but order of items is not guaranteed.

    If you need to add unique items in order, you can group and add elements via $addToSet, then $unwind the array with elements, $sort by items, and then do $group again with $push items.

    0 讨论(0)
  • 2020-12-08 09:30

    $addToSet do not add the item to the given field if it already contains it, on the other hand $push will add the given object to field whether it exists or not.

    {_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]}
    
    0 讨论(0)
  • 2020-12-08 09:30

    As the name suggest $addToSet (set) wont allow duplicates while $push simply add the element to array

    0 讨论(0)
  • 2020-12-08 09:40

    $addToSet and $push does the same thing, however $push just pushes any item disregarding the duplication causing redundancy. The former pushes only unique items, no duplication.

    0 讨论(0)
  • 2020-12-08 09:47

    Along side the differences that others have mentioned

    • $push: Appends an object to an array
    • $addToSet: Adds an object to an array if it does not exists

    There is a difference in replication. (This can be seen if by taking a look at local.oplog.rs)

    • $push operations (that actually modified the array) are replicated as $set.items.INDEX: item
    • $addToSet operations (that actually modified the array) are replicated as $set.items: [THE_ENTIRE_ARRAY]

    If you are dealing with large arrays, then the difference might be significant

    So while something like (the typical use case to maintain unique array)

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

    might end up with the same resulting document, there is a difference in the replicated operation.

    0 讨论(0)
提交回复
热议问题