MongoDB -删除数组内对象中的空值

dpiehjr4  于 2023-01-12  发布在  Go
关注(0)|答案(1)|浏览(173)

我有一个包含对象数组的示例文档

[
  { 
    array_a: [{"key1": "val1", "key2": "val2", "key3": null}, ...],
    array_b: [{"key4": "val1", "key5": null, "key6": null}, ...]
  }, 
  ... 
]

如何删除值为null的键?变为:

[
  { 
    array_a: [{"key1": "val1", "key2": "val2"}, ...],
    array_b: [{"key4": "val1"}, ...]
  }, 
  ... 
]
anauzrmj

anauzrmj1#

查询有点长。

  1. $set
    1.1.(array_a$map-从 1.1.1 迭代数组并返回新数组。
    1.1.1. input-$map-将array_a中的每个文档转换为键值对数组:[{ k: "key1", v: "val1" }] .
    1.1.2. $filter-过滤v不是null的文档(键值对)。
    1.2.(array_b)与 1.1 的解释相同。
  2. x1米11米1x
    2.1.(一米十二分一秒)一米十三分一秒
    2.1.1 input-$map-迭代数组中的每个数组文档,以返回一个带有对象的数组。
    2.1.2 cond-过滤非空文档{}
    2.2.(array_b)-与 2.1 的解释相同。
db.collection.aggregate([
  {
    $set: {
      "array_a": {
        $map: {
          input: {
            $map: {
              input: "$array_a",
              in: {
                $objectToArray: "$$this"
              }
            }
          },
          in: {
            $filter: {
              input: "$$this",
              as: "kv",
              cond: {
                $ne: [
                  {
                    "$getField": {
                      "field": "v",
                      "input": "$$kv"
                    }
                  },
                  null
                ]
              }
            }
          }
        }
      },
      "array_b": {
        $map: {
          input: {
            $map: {
              input: "$array_b",
              in: {
                $objectToArray: "$$this"
              }
            }
          },
          in: {
            $filter: {
              input: "$$this",
              as: "kv",
              cond: {
                $ne: [
                  {
                    "$getField": {
                      "field": "v",
                      "input": "$$kv"
                    }
                  },
                  null
                ]
              }
            }
          }
        }
      }
    }
  },
  {
    $set: {
      "array_a": {
        $filter: {
          input: {
            $map: {
              input: "$array_a",
              in: {
                $arrayToObject: "$$this"
              }
            }
          },
          cond: {
            $ne: [
              "$$this",
              {}
            ]
          }
        }
      },
      "array_b": {
        $filter: {
          input: {
            $map: {
              input: "$array_b",
              in: {
                $arrayToObject: "$$this"
              }
            }
          },
          cond: {
            $ne: [
              "$$this",
              {}
            ]
          }
        }
      }
    }
  }
])

Sample Mongo Playground

  • 注:$set级可以合并为一个级,也可以分成多个级以提高可读性。*

相关问题