Я столкнулся с этим и был расстроен, увидев, что единственное, что могло сделать это - использовать вложенный forEach. Поэтому после некоторых поисков я нашел другой путь! Начиная с версии 3.6, существует позиционный оператор all ($[]
) (версия 3.6 была введена таким образом после того, как был задан этот вопрос ... и даже после того, как он был активен в последний раз, НО кто-нибудь другой сталкивался с этим )
Чтобы удалить столбец myval
из первого встроенного документа для сопоставления, сделайте следующее:
db.coll.update(
{things: {'$exists': true}},
{$unset: {'things.$[].myval': 1}}
)
или если вы хотите удалить его из всех соответствующих документов, используйте updateMany
db.coll.updateMany(
{things: {'$exists': true}},
{$unset: {'things.$[].myval': 1}}
)
$unset
будет редактировать его только в том случае, если значение существует, но оно не будет выполнять безопасную навигацию (т. Е. Не будет проверять, существуют ли вещи в первую очередь), поэтому существует необходимость во встроенном документе / массиве.