objects array addtoset mongodb

array - mongodb addtoset each



MongoDb: diferencia entre $ push/$ addtoset (6)

Leí la documentación en MongoDb y utilicé pruebas simples y solo busco eso: Push está ordenando la matriz pero addtoSet no lo es.

Para mí visualmente es lo mismo, no sé la diferencia.

¿Alguien podría explicarme la diferencia?

Otro pensamiento, si podría estar en español o en un inglés simple, lo aprecio.


$ addToSet y $ push hacen lo mismo, sin embargo, $ push solo empuja cualquier elemento sin tener en cuenta la duplicación que causa redundancia. El primero empuja solo elementos únicos, sin duplicación.


$ push: inserta el valor en una matriz en el documento resultante. p.ej;

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

$ addToSet: inserta el valor en una matriz en el documento resultante pero no crea duplicados. p.ej;

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


Como su nombre indica, $ addToSet (set) no permitirá duplicados, mientras que $ push simplemente agrega el elemento a la matriz


Junto a las diferencias que otros han mencionado

  • $push : agrega un objeto a una matriz
  • $addToSet : agrega un objeto a una matriz si no existe

Hay una diferencia en la replicación. (Esto se puede ver si echa un vistazo a local.oplog.rs )

  • $push operaciones $push (que realmente modificaron la matriz) se replican como $set.items.INDEX: item
  • $addToSet operaciones $addToSet (que realmente modificaron la matriz) se replican como $set.items: [THE_ENTIRE_ARRAY]

Si se trata de matrices grandes, entonces la diferencia podría ser significativa

Entonces, mientras que algo así (el caso de uso típico para mantener una matriz única)

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

puede terminar con el mismo documento resultante, hay una diferencia en la operación replicada.


$addToSet no agrega el elemento al campo dado si ya lo contiene, por otro lado $push agregará el objeto dado al campo si existe o no.

{_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]}


$ push : agrega elementos en el orden en que se recibieron. También puede agregar los mismos elementos varias veces.

$ addToSet : agrega solo elementos únicos, pero no se garantiza el orden de los elementos.

Si necesita agregar elementos únicos en orden, puede agrupar y agregar elementos a través de $ addToSet, luego $ desenrollar la matriz con elementos, $ ordenar por elementos y luego hacer $ group nuevamente con $ elementos de inserción.