Як повністю видалити поле з документа MongoDB?


307
{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

Припустимо, це документ. Як wordsповністю видалити " " з усіх документів із цієї колекції? Я хочу, щоб усі документи були " words":

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}

Відповіді:


531

Спробуйте це: Якщо ваша колекція була "прикладом"

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});

1
Див рішення цього питання для пояснення помилкових / істинного stackoverflow.com/questions/7714216 / ...
DSEL

1
На цій сторінці більше немає коментарів від "Nic Cottrell" :)
Дан Даскалеску

6
Я щось пропускаю, чи це було неправильно протягом 8+ років, тому що tags.wordsмає бути $unset, ні words? Дивіться також відповідь Сальвадора Далі.
Дан Даскалеску

1
Ви також можете використовувати updateManyзамість {multi:true}, тобтоdb.example.updateMany({},{"$unset":{words:""}})
Кіп

158

На початку я не зрозумів, чому питання має щедрість (я думав, що на це питання є приємною відповіддю, і нічого додати), але потім я помітив, що відповідь, яка була прийнята і закликана 15 разів, насправді була неправильною!

Так, вам потрібно скористатися $unsetоператором , але це скасування видалить ключ слова, який не існує для документа для колекції. Так що в основному це нічого не зробить.

Тому вам потрібно сказати Монго шукати теги документів, а потім слова, використовуючи крапкові позначення . Тож правильний запит.

db.example.update(
  {},
  { $unset: {'tags.words':1}},
  false, true
)

Просто задля завершення я посилаюся на інший спосіб цього зробити , що набагато гірше, але таким чином ви можете змінити поле будь-яким спеціальним кодом (навіть на основі іншого поля з цього документа).


2
Крім цього, якщо теги є масивом, він би виглядав так: db.example.update ({}, {$ unset: {'теги. $ []. Слова': 1}}, false, правда)
Manan Шах

21
db.example.updateMany({},{"$unset":{"tags.words":1}})

Ми також можемо використовувати це для оновлення декількох документів.


2
Я вважаю це зрозумілішим, ніж передавати false, trueостанні два аргументи доupdate()
Кіп

17

Щоб видалити або видалити поле в MongoDB

  • Для одного запису

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
  • Для запису мульти

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})

2

Я намагався зробити щось подібне до цього, але замість цього видалити стовпчик із вбудованого документа. Мені знадобилося деякий час, щоб знайти рішення, і це був перший пост, на який я натрапив, тому я подумав, що опублікую це тут для всіх, хто намагається зробити те саме.

Тож скажімо, замість цього ваші дані виглядають так:

{ 
  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


1

За замовчуванням метод 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})

1

Починаючи 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оператор, який використовується, є агрегацією (на відміну від запиту ), синтаксис якого займає масив полів.



0

А для mongomapper,

  • Документ: Вимкнення
  • Поле для видалення: shutoff_type

Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )


0

Оскільки я постійно знаходив цю сторінку, шукаючи спосіб видалити поле за допомогою MongoEngine, я думаю, може бути корисним і для публікації способу MongoEngine тут:

Example.objects.all().update(unset__tags__words=1)


-3

Перевірка наявності "слів" та видалення з документа

    db.users.update({"tags.words" :{$exists: true}},
                                           {$unset:{"tags.words":1}},false,true);

true означає оновлення декількох документів, якщо вони збігаються.


Вам не потрібно перевіряти наявність. У документації зазначається, що: "Якщо поле не існує, то $ unset нічого не робить (тобто жодної операції)."
Дан Даскалеску

-4

Ви також можете зробити це у сукупності, використовуючи проект у 3.4

{$ project: {"tags.words": 0}}


-7

Щоб посилатися на пакет і видалити різні "ключі", спробуйте це

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.