MongoDB $elemMatch 与同一文档中的字段进行比较

MongoDB $elemMatch comparison to field in same document

我想创建一个聚合步骤来匹配文档中字段值存在于同一文档数组中的文档。

在一个非常有效的示例中(注意这是非常简化的;这将适合更大的现有管道),给定文档:

{
    "_id":{"$oid":"61a9085af9733d0274c41990"},
    "myArray":[
        {"$oid":"61a9085af9733d0274c41991"},
        {"$oid":"61a9085af9733d0274c41992"},
        {"$oid":"61a9085af9733d0274c41993"}
    ],
    "myField":{"$oid":"61a9085af9733d0274c41991"}   // < In 'myArray' collection
}

{
    "_id":{"$oid":"61a9085af9733d0274c41990"},
    "myArray":[
        {"$oid":"61a9085af9733d0274c41991"},
        {"$oid":"61a9085af9733d0274c41992"},
        {"$oid":"61a9085af9733d0274c41993"}
    ],
    "myField":{"$oid":"61a9085af9733d0274c41994"}   // < Not in 'myArray' collection
}

我要匹配第一个,因为myField的值存在于集合中,但不存在第二个文档。

感觉这应该是一个非常简单的 $elemMatch 操作和 $eq 运算符,但我无法让它工作,我发现的每个示例都使用文字。我目前得到的是下面的内容,我已经尝试了 myField 周围的各种引号和美元符号组合。

[{
    $match: {
        myArray: {
            $elemMatch: {
                $eq: '$this.myField'
            }
        }
    }
}]

我做错了什么很明显吗?是否不能在同一文档中使用具有 $eq 的字段值?

希望有人能指出我的愚蠢之处:)

谢谢

您可以简单地在聚合管道中执行 $in

db.collection.aggregate([
  {
    "$match": {
      $expr: {
        "$in": [
          "$myField",
          "$myArray"
        ]
      }
    }
  }
])

这里是Mongo playground供您参考。