Я пытался сделать что-то похожее на это, но вместо этого удалить столбец из встроенного документа. Мне понадобилось некоторое время, чтобы найти решение, и это был первый пост, с которым я столкнулся, поэтому я подумал, что опубликую это здесь для всех, кто пытается сделать то же самое.
Допустим, вместо этого ваши данные выглядят так:
{
name: 'book',
tags: [
{
words: ['abc','123'],
lat: 33,
long: 22
}, {
words: ['def','456'],
lat: 44,
long: 33
}
]
}
Чтобы удалить столбец words
из внедренного документа, сделайте следующее:
db.example.update(
{'tags': {'$exists': true}},
{ $unset: {'tags.$[].words': 1}},
{multi: true}
)
или используя updateMany
db.example.updateMany(
{'tags': {'$exists': true}},
{ $unset: {'tags.$[].words': 1}}
)
$unset
будет редактировать его только в том случае, если значение существует, но не будет выполнять безопасную навигацию (оно не проверяет, существует ли tags
первым), поэтому существует необходимость во встроенном документе.
При этом используется позиционный оператор all ($[]
), который был представлен в версии 3.6