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

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

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

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}
TIMEX
источник

Ответы:

532

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

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});
Shaunak
источник
1
Посмотрите решение этого вопроса для объяснения ложного / истинного stackoverflow.com/questions/7714216/…
Дсел
1
На этой странице больше нет комментариев от "Nic Cottrell" :)
Dan Dascalescu
6
Я что-то упустил, или это было неправильно в течение 8 лет, потому что tags.wordsдолжно быть $unset, нет words? Смотрите также ответ Сальвадора Дали.
Дан Дакалеску
1
Вы также можете использовать updateManyвместо {multi:true}, то естьdb.example.updateMany({},{"$unset":{words:""}})
Кип
158

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

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

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

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

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

Сальвадор Дали
источник
2
В дополнение к этому, если теги являются массивом, это будет выглядеть так: db.example.update ({}, {$ unset: {'tags. $ []. Words': 1}}, false, true)
Manan Шах
21
db.example.updateMany({},{"$unset":{"tags.words":1}})

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

Vipul
источник
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 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})
Amitesh
источник
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что используемый оператор является оператором агрегирования (в отличие от оператора «запроса» ), синтаксис которого принимает массив полей.

Ксавье Гихот
источник
1

Решение для PyMongo (Питон Монго):

db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);
Якир Цубери
источник
0

И для mongomapper,

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

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

Джон Керн
источник
0

Поскольку я продолжал находить эту страницу, когда искал способ удалить поле с помощью MongoEngine, я думаю, что было бы полезно опубликовать здесь также MongoEngine:

Example.objects.all().update(unset__tags__words=1)
прачечная-автомат
источник
-2

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

Ans:

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

Poonam Agrawal
источник
-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"
}
)]
aspadacio
источник