MongoDb: разница между $push/$addtoset
Я прочитал документацию в MongoDb, и я использовал простые доказательства, и я только смотрю, что:
Push сортирует массив, но addtoSet
это не он.
Для меня визуально то же самое, я не знаю разницы.
Может ли кто-нибудь объяснить мне разницу?
Другой думает, может ли это быть на испанском или просто на английском, я его одобрю.
Ответы
Ответ 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"}}}])