执行 MongoDB 聚合查询以匹配嵌套数组中的 objectId 时遇到问题

问题描述 投票:0回答:1

我遇到了 MongoDB 聚合查询的问题,该查询旨在根据给定的“类型”和“版本”的优惠查找艺术,其中 OfferId 存在于“linkedOffers.include”数组中。 以下是我的报价和艺术文件的示例:

报价文件:

{
  "_id": { "$oid": "6452110c0881247e0a8d17d2" },
  "type": "TYPE_1",
  "version": "VERSION_1"
}

艺术文件:

{
  "_id": { "$oid": "6571bcbd9be813d7440e8055" },
  "artName": "Art 0",
  "linkedOffers": [
    {
      "offerType": "TYPE_1",
      "include": [
        { "offerId": { "$oid": "6452110c0881247e0a8d17d2" } }
      ]
    }
  ]
}

我尝试了以下聚合查询:

offers.aggregate([
  {
    $match: {
      type: "TYPE_1",
      version: "VERSION_1"
    }
  },
  {
    $lookup: {
      from: "arts",
      let: { offerId: "$_id" },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$$offerId", "$linkedOffers.include.offerId""
              ]
            }
          }
        }
      ],
      as: "linkedArts"
    }
  }
])

但是,此查询不会返回任何匹配的艺术,即使它应该返回。 当我单独测试

$match
阶段时,它对于单独的艺术文档效果很好。

我怀疑问题出在匹配表达式“$linkedOffers.include.offerId”上,因为 linkedOffers.include 是一个对象数组。 我还检查了使用单独的查询将艺术直接与 linkedOffers.include.offerId 进行匹配的效果。

有人可以帮助我理解为什么聚合管道中的

$match
阶段无法正常工作并提供此问题的解决方案吗?

提前感谢您的协助

mongodb pipeline aggregation
1个回答
0
投票

在 mongo 查询语言中,如果数组包含该值,则单个项目与数组的相等匹配将返回 true。

这意味着您可以使用关联形式的查找,并避免有时会混淆索引使用的 $expr 表达式。

db.offers.aggregate([
 {$match: {
      type: "TYPE_1",
      version: "VERSION_1"
 }},
 {$lookup: {
      from: "arts",
      localField: "_id",
      foreignField: "linkedOffers.include.offerId",
      as: "linkedArts"
 }}
])

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.