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

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

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

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

8 ответов


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

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

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

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

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

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

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


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

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

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
    
  • Для Multi Записи

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

db.example.updateMany({},{"$unset":{"tags.words":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})

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

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

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


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

{$project: {"теги.слова": 0} }


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

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