在进行聚合时,如何检查mongodb对象中是否存在键,其中键是文档中某个其他字段的值?

在进行聚合时,如何检查mongodb对象中是否存在键,其中键是文档中某个其他字段的值?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,首先,我知道我们可以使用点运算符检查钥匙是否存在,但在我的情况下,它不起作用,我不知道为什么 到目前为止,在聚合管道中,我有以下记录 { "my_key":"1234" "data":{ 1234:"abc" 4567:"xyz" } } { "my_key":"6666" "data":{

首先,我知道我们可以使用点运算符检查钥匙是否存在,但在我的情况下,它不起作用,我不知道为什么

到目前为止,在聚合管道中,我有以下记录

{
  "my_key":"1234"
  "data":{
    1234:"abc"
    4567:"xyz"
  }
}

{
  "my_key":"6666"
  "data":{
    1234:"abc"
    4567:"xyz"
  }
}
我想返回数据对象中不存在
my_key
值的文档。因此,根据上面的示例,它应该返回第二个文档

我尝试使用
$match
操作符,如下所示,但它似乎不起作用

$match :
{
  "data.$my_key":{$exists:false}
}
这不起作用,我不明白为什么:( 这是因为
my\u key
值是字符串,而
数据
对象中的键不是字符串吗?

如果您需要原始格式的数据,您可以添加以下作为最后一个阶段

{
    $project: {
      "data": {
        "$arrayToObject": "$data"
      },
      "my_key": 1
    }
  }

我完全可以这样做,但我无法解开
数据
字段:(因为这对我不起作用。为什么它不起作用?你所做的是正确的,并且是问题的实际答案,但我希望在不解开某个时间的答案的情况下实现同样的结果。请检查更新,只需几次尝试就可以做得更好
db.collection.aggregate([
  {
    "$project": {
      "data": {
        "$objectToArray": "$data"
      },
      "my_key": 1
    }
  },
  {
    $project: {
      "output": {
        "$map": {
          "input": "$data",
          "as": "data",
          "in": {
            "$eq": [
              "$$data.k",
              "$my_key"
            ]
          }
        }
      },
      "data": 1,
      "my_key": 1
    }
  },
  {
    $match: {
      output: true
    }
  }
])
{
    $project: {
      "data": {
        "$arrayToObject": "$data"
      },
      "my_key": 1
    }
  }