Как полностью удалить поле из документа MongoDB?

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

Чтобы удалить или удалить поле в MongoDB

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

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

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

Ответ 4

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

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

Ответ 5

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

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

{ 
  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

Ответ 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})

Ответ 7

И для mongomapper,

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

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

Ответ 8

Начиная с 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 является агрегирующим (в отличие от оператора "запроса"), синтаксис которого принимает массив полей.

Ответ 9

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

Ans:

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

Ответ 10

Проверка наличия "слов" и последующего удаления из документа

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

true указывает на обновление нескольких документов, если они совпадают.

Ответ 11

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

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

Ответ 12

Чтобы ссылаться на пакет и удалять различные "ключи", попробуйте это

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]