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

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

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

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}
Теги:
database
mongodb-query

10 ответов

403
Лучший ответ

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

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});
  • 0
    Знаете ли вы, почему ложное, истинное работает?
  • 1
    Посмотрите решение этого вопроса для объяснения ложного / истинного stackoverflow.com/questions/7714216/…
Показать ещё 1 комментарий
139

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

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

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

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

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

  • 6
    Это должно быть помечено как правильное.
  • 0
    В дополнение к этому, если теги являются массивом, это будет выглядеть так: db.example.update ({}, {$ unset: {'tags. $ []. Words': 1}}, false, true)
16

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

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

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

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
    
8
db.example.updateMany({},{"$unset":{"tags.words":1}})

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

0

И для mongomapper,

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

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

0

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

Ans:

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

0

По умолчанию метод 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})
-1

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

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

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

  • 0
    Вам не нужно проверять существование. Документация гласит : «Если поле не существует, то $ unset ничего не делает (т.е. не выполняет никаких операций)».
-4

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

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

-5

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню