MongoDB -匹配密钥

z9smfwbn  于 2022-11-22  发布在  Go
关注(0)|答案(1)|浏览(137)

我想$match在一个MongoDB中,文档的数量以千计,所以寻找动态sol:
$doc.k等于k$match之后的$info.data.k,那么我们就有了一个只包含$matchs的信息的文档,请参见预期的输出文档。如果您有任何问题,请告诉我。

[
  {
    "doc": {
      "k": "ABC",
      "v": {
        "sec": 0
      }
    },
    "info": [
      {
        "data": [
          {
            "k": "XYZ",
            "v": {
              "know": "alpha"
            }
          },
          {
            "k": "ABC",
            "v": {
              "know": "alpha"
            }
          }
        ]
      }
    ]
  }
]

预期的输出文档如下所示

[
  {
    "doc": {
      "k": "ABC",
      "v": {
        "sec": 0
      }
    },
    "info": [
      {
        "data": [
          {
            "k": "ABC",
            "v": {
              "know": "alpha"
            }
          }
        ]
      }
    ]
  }
]
2jcobegt

2jcobegt1#

  1. $set-更新info字段。
    1.1. $map-由于info是一个数组,因此需要迭代info数组中的每个文档并返回一个新数组。
    1.1.1. $filter-通过doc.k和当前迭代k值过滤文档。
db.collection.aggregate([
  {
    $set: {
      info: {
        $map: {
          input: "$info",
          in: {
            data: {
              $filter: {
                input: "$$this.data",
                cond: {
                  $eq: [
                    "$doc.k",
                    "$$this.k"
                  ]
                }
              }
            }
          }
        }
      }
    }
  }
])

Sample Mongo Playground

相关问题