Как полностью удалить поле из документа MongoDB? - PullRequest
256 голосов
/ 28 июля 2011
{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

Предположим, это документ.Как полностью удалить «words» из всех документов в этой коллекции?Я хочу, чтобы все документы были без "words":

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

Ответы [ 12 ]

445 голосов
/ 28 июля 2011

Попробуйте: если ваша коллекция была «примером»

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});
148 голосов
/ 10 ноября 2013

Вначале я не понял, почему у вопроса есть награда (я думал, что на вопрос есть хороший ответ, и добавить нечего), но потом я заметил, что ответ, который был принят и проголосован 15 раз, был на самом деле неправильно!

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

Таким образом, вы должны указать Mongo искать в тегах документа, а затем в словах, используя точечная нотация . Итак, правильный запрос:

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

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

16 голосов
/ 21 мая 2016

Для удаления или удаления поля в MongoDB

  • Для одиночной записи

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
    
  • для нескольких записей

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
    
12 голосов
/ 16 октября 2017
db.example.updateMany({},{"$unset":{"tags.words":1}})

Мы также можем использовать это для обновления нескольких документов.

1 голос
/ 11 апреля 2019

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

Допустим, вместо этого ваши данные выглядят так:

{ 
  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

0 голосов
/ 23 июня 2019

Начиная с 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 } }

Метод update также может принимать конвейер агрегации (обратите внимание на квадратные скобки, обозначающие использованиеконвейера агрегации).

Это означает, что используемый оператор $unset является агрегацией (в отличие от "query" one ), синтаксис которогозанимает массив полей.

0 голосов
/ 04 февраля 2019

А для mongomapper,

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

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

0 голосов
/ 30 октября 2018

{имя: 'книга', теги: {слова: ['abc', '123'], широта: 33, длина: 22}}

Ответ:

дБ.tablename.remove ({ 'tags.words': [ 'ABC', '123']})

0 голосов
/ 09 августа 2018

По умолчанию метод 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})
0 голосов
/ 02 августа 2017

Вы также можете сделать это в агрегации, используя проект на 3.4

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...