Документы моей коллекции:
{
"_id" : 1,
"fruits" : [ {"name":"pears"},
{"name":"grapes"},
{"name":"bananas"} ],
}
{
"_id" : 2,
"fruits" : [ {"name":"bananas"} ],
}
Мне нужно удалить весь документ, если фрукты содержат только "бананы", или удалить фрукты "бананы" только тогда, когда в фруктах содержится более одного фрукта.массив.
Моя последняя коллекция после выполнения обязательного запроса должна быть:
{
"_id" : 1,
"fruits" : [ {"name":"pears"},
{"name":"grapes"}],
}
В настоящее время я использую два запроса, чтобы сделать это:
db.collection.remove({'fruits':{$size:1, $elemMatch:{'name': 'bananas'} }}) [this will remove the document when only one fruit present]
и
db.collection.update({},{$pull:{'fruits':{'name':'bananas'}}},{multi: true}) [this will remove the entry 'bananas' from the array]
Есть ли способ объединить их в один запрос ?
РЕДАКТИРОВАТЬ: Окончательный вариант
- Я полагаю, что для выполнения вышеуказанных задач не существует "одного запроса", поскольку намерения сильно отличаются от обоих действий.
- Лучшее, что можно выполнить: объединить действия взапрос bulk_write, сохраняющий данные ввода-вывода в сети (как указано в ответе Нила).Это считается более полезным, когда у вас есть несколько таких действий.Кроме того, bulk_write может обеспечить функцию блокировки в том смысле, что режим «упорядоченного» режима bulk_write делает действия последовательными, прерывая и останавливая выполнение в случае ошибки.
Следовательно, то параметр bulk_write более полезен, когда выполняемые действиядолжны быть последовательными.Что-то вроде «цепочки» в JS.Существует также возможность выполнять неупорядоченные объемные записи.
Кроме того, действия, указанные в массовой записи, работают с collection level as individual actions.