Удаление нулевых значений из объекта массива mongodb

Как я могу удалить нулевые элементы из этого массива с помощью updateMany? У меня есть много документов по этому шаблону с нулевыми значениями, и я хочу обновить их все без нулевых значений.

{

  "car": "Honda",
  "color": [
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    "red",
    "orange"

    
  ]
}

Я попытался

db.db_urls.updateMany({color: null}, { $unset : { color: 1 }})

но он удаляет содержимое всех полей

Отвечает ли это на ваш вопрос? Удаление нулевых объектов из json в mongodb

ray 11.05.2022 21:03
update({},{"$pull": {"color": {"$eq": null}}},{"multi": true}) попробуйте это, если вы все еще застряли, я думаю, вам это нужно
Takis 11.05.2022 21:56
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
2
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вариант 1. Использование конвейера агрегации внутри запроса update() с $filter:

db.collection.update({
 color: {
  $exists: true,
  $eq: null
 }
},
[
 {
  $addFields: {
   color: {
    $filter: {
      input: "$color",
      as: "c",
      cond: {
        $ne: [
          "$$c",
          null
        ]
      }
    }
   }
  }
 }
],
{
 multi: true
})

Объяснение:

  1. Соответствовать только документам, в которых существует цвет массива и содержится хотя бы одно нулевое значение.
  2. Замените массив цветов таким же без нулевых значений
  3. Добавьте {multi:true} для применения ко всем найденным документам.

детская площадка

Вариант 2. Удалить все нулевые элементы в массиве цветов с помощью $pull:

db.collection.update({
 color: {
   $exists: true,
   $eq: null
 }
},
{
 $pull: {
   color: null
}
},
{
  multi: true
})

Объяснение:

  1. Соответствует всем документам, имеющим массив цветов и хотя бы один нулевой элемент.
  2. Удалить ( $pull ) все элементы массива нулевого цвета
  3. Применить ко всем совпавшим документам ( multi:true )

детская площадка

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

Другие вопросы по теме