Відповіді:
Спробуйте це: Якщо ваша колекція була "прикладом"
db.example.update({}, {$unset: {words:1}}, false, true);
Перегляньте це:
http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset
ОНОВЛЕННЯ :
Наведене вище посилання більше не охоплює "$ unset'ing". Обов’язково додайте, {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
оператором , але це скасування видалить ключ слова, який не існує для документа для колекції. Так що в основному це нічого не зробить.
Тому вам потрібно сказати Монго шукати теги документів, а потім слова, використовуючи крапкові позначення . Тож правильний запит.
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 для оновлення всіх документів, які відповідають критеріям запиту.
Змінено у версії 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 (Python mongo):
db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);
Оскільки я постійно знаходив цю сторінку, шукаючи спосіб видалити поле за допомогою MongoEngine, я думаю, може бути корисним і для публікації способу MongoEngine тут:
Example.objects.all().update(unset__tags__words=1)
{ім'я: 'книга', теги: {слова: ['abc', '123'], лат: 33, довго: 22}}
Відповідь:
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}}