从数组对象中删除空值 mongodb

Removing null values from array object 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 }})

但它正在删除所有字段的内容

选项 1. 在带有 $filter 的 update() 查询中使用聚合管道:

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} 以应用于所有找到的文件

playground

选项 2. 使用 $pull 删除颜色数组中的所有空元素:

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

解释:

  1. 匹配所有具有颜色数组和至少一个空元素的文档。
  2. 删除 ($pull) 所有空颜色数组元素
  3. 应用于所有匹配的文档(multi:true)

playground

我会使用选项 2,因为它看起来很简单,但在某些情况下,对于更大的集合,$pull 操作可能执行得更慢,因此最好测试一下...