Подтвердить что ты не робот

MongoDb: разница между $push/$addtoset

Я прочитал документацию в MongoDb, и я использовал простые доказательства, и я только смотрю, что: Push сортирует массив, но addtoSet это не он.

Для меня визуально то же самое, я не знаю разницы.

Может ли кто-нибудь объяснить мне разницу?

Другой думает, может ли это быть на испанском или просто на английском, я его одобрю.

4b9b3361

Ответ 1

$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]}

Ответ 2

$ push - добавляет элементы в том порядке, в котором они были получены. Также вы можете добавить одни и те же предметы несколько раз.

$ addToSet - добавляет только уникальные предметы, но порядок предметов не гарантируется.

Если вам нужно добавить уникальные элементы по порядку, вы можете группировать и добавлять элементы через $ addToSet, затем $ разматывать массив с элементами, $ сортировать по элементам, а затем снова делать $ group с элементами $ push.

Ответ 3

$addToSet и $push делает то же самое, однако $push просто подталкивает любой элемент без учета дублирования, вызывающего избыточность. Первый подталкивает только уникальные предметы, без дублирования.

Ответ 4

Как следует из названия, $addToSet (set) не разрешает дублирование а $push просто добавляет элемент в массив

Ответ 5

Наряду с различиями, которые упоминали другие

  • $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',
  }}
)

может закончиться тем же самым результирующим документом, есть разница в реплицированной операции.

Ответ 6

$ push: вставляет значение в массив в результирующий документ. например;

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

$ addToSet: вставляет значение в массив в результирующем документе, но не создает дубликаты. например;

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