Ответы:
Попробуйте это: если ваша коллекция была «примером»
db.example.update({}, {$unset: {words:1}}, false, true);
Порекомендуйте это:
http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset
ОБНОВЛЕНИЕ :
Приведенная выше ссылка больше не распространяется на $ unset. Не забудьте добавить, {multi: true}
если вы хотите удалить это поле из всех документов в коллекции; в противном случае он удалит его только из первого найденного документа. Смотрите это для обновленной документации:
https://docs.mongodb.com/manual/reference/operator/update/unset/
Пример:
db.example.update({}, {$unset: {words:1}} , {multi: true});
tags.words
должно быть $unset
, нет words
? Смотрите также ответ Сальвадора Дали.
updateMany
вместо {multi:true}
, то естьdb.example.updateMany({},{"$unset":{words:""}})
Вначале я не понимал, почему у вопроса есть щедрость (я думал, что на вопрос есть хороший ответ, и добавить нечего), но потом я заметил, что ответ, который был принят и проголосован 15 раз, был на самом деле неправильным!
Да, вы должны использовать $unset
оператор , но этот сброс приведет к удалению ключа слова, который не существует для документа для коллекции. Так что в принципе это ничего не даст.
Таким образом, вы должны указать Mongo искать теги документа, а затем слова, используя точечную запись . Итак, правильный запрос.
db.example.update(
{},
{ $unset: {'tags.words':1}},
false, true
)
Просто для завершения я буду ссылаться на другой способ сделать это , который намного хуже, но таким образом вы можете изменить поле с любым пользовательским кодом (даже на основе другого поля из этого документа).
Удалить или удалить поле в MongoDB
Для одиночной записи
db.getCollection('userData').update({}, {$unset: {pi: 1}})
Для мульти записи
db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
Я пытался сделать что-то похожее на это, но вместо этого удалить столбец из встроенного документа. Мне понадобилось некоторое время, чтобы найти решение, и это был первый пост, с которым я столкнулся, поэтому я подумал, что опубликую это здесь для всех, кто пытается сделать то же самое.
Допустим, вместо этого ваши данные выглядят так:
{
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
существует ли сначала), поэтому существует необходимость во встроенном документе.
Это использует все позиционный оператор ( $[]
), который был представлен в версии 3.6
По умолчанию метод update () обновляет один документ. Установите параметр Multi Parameter для обновления всех документов, которые соответствуют критериям запроса.
Изменено в версии 3.6. Синтаксис:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)
Пример :
db.getCollection('products').update({},{$unset: {translate:1, qordoba_translation_version:1}}, {multi: true})
В вашем примере:
db.getCollection('products').update({},{$unset: {'tags.words' :1}}, {multi: true})
Начиная Mongo 4.2
, также возможно использовать немного другой синтаксис:
// { name: "book", tags: { words: ["abc", "123"], lat: 33, long: 22 } }
db.collection.update({}, [{ $unset: ["tags.words"] }], { many: true })
// { name: "book", tags: { lat: 33, long: 22 } }
обновление также может принимать конвейер агрегации (обратите внимание на квадратные скобки, обозначающие использование конвейера агрегации).
Это означает, $unset
что используемый оператор является оператором агрегирования (в отличие от оператора «запроса» ), синтаксис которого принимает массив полей.
Решение для PyMongo (Питон Монго):
db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);
Поскольку я продолжал находить эту страницу, когда искал способ удалить поле с помощью MongoEngine, я думаю, что было бы полезно опубликовать здесь также MongoEngine:
Example.objects.all().update(unset__tags__words=1)
{имя: 'книга', теги: {слова: ['abc', '123'], широта: 33, длина: 22}}
Ans:
db.tablename.remove ({ 'tags.words': [ 'ABC', '123']})
Проверка наличия «слов» и удаление из документа
db.users.update({"tags.words" :{$exists: true}},
{$unset:{"tags.words":1}},false,true);
Значение true означает обновление нескольких документов, если они совпадают.
Вы также можете сделать это в агрегации с помощью проекта на 3.4
{$ project: {"tags.words": 0}}