【问题标题】:MongoDB aggregation filter array of subdocuments by missing fieldMongoDB聚合过滤子文档数组的缺失字段
【发布时间】:2020-10-16 21:40:54
【问题描述】:

给定以下集合:

db.test.insertOne(
    {
        test: [
            {a: "1", b: "2"},
            {a: "3"}
        ]
    }
)

如何在聚合中过滤掉测试数组的第二个文档(带有不存在的字段 b)?

聚合

db.test.aggregate([
    {
        $project: {
            test: {
                $filter: {
                    input: "$test",
                    cond: {
                        $ne: ["$$this.b", null]
                    }
                }
            }
        }
    }
])

仍然返回包含不存在字段 b 的子文档:

{
    "_id": {"$oid": "xyz"},
    "test": [
      {
        "a": "1",
        "b": "2"
      },
      {
        "a": "3"
      }
    ]
  }

我希望得到以下结果:

{
    "_id": {"$oid": "xyz"},
    "test": [
      {
        "a": "1",
        "b": "2"
      }
    ]
  }

显然我的管道比这更复杂,但问题归结为这个小例子。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    Null 和 missing 是 BSON 中的不同类型。要测试是否丢失,请与 $type 进行比较:

                        cond: {
                            $ne: [{$type:"$$this.b"}, "missing"]
                        }
    

    Playground

    【讨论】:

    • 感谢您,这解决了问题。但这是如何工作的:docs.mongodb.com/manual/tutorial/query-for-null-fields 这个逻辑不应该适用于所有地方吗?
    • 在查询语言中添加了一个特殊情况,因此 null 将匹配不存在的,但这似乎是唯一的地方。
    • 在 mongoDB 4.2 中出现同样的问题,谢谢你为我节省了一天
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多