从Mongodb聚合中的另一个集合返回匹配的子对象

v09wglhw  于 2022-11-28  发布在  Go
关注(0)|答案(1)|浏览(103)

集合商品具有item_code、tax_category_code和价格。

{'item_code':'A001', 'tax_category_code':'T001', 'price': 98},
{'item_code':'A002', 'tax_category_code':'T002', 'price': 39},
{'item_code':'A003', 'tax_category_code':'T001', 'price': 77},
{'item_code':'A004', 'tax_category_code':'T003', 'price': 52},

收集tax_schema具有状态、类别和日期。每个类别都具有tax_category_code和百分比。

{'status':'active', 'categories': [ {'tax_category_code':'T001', 'priority': 1, 'percentage': 0.1}, {'tax_category_code':'T002', 'priority': 3, 'percentage': 0.5}, {'tax_category_code':'T003', 'priority': 2, 'percentage': 0.87} ], 'date': '2022-11-24T00:00:00-05:00'},
{'status':'inactive', 'categories': [ {'tax_category_code':'T001', 'priority': 0, 'percentage': 0.08}, {'tax_category_code':'T002', 'priority': 2, 'percentage': 0.42}, {'tax_category_code':'T003', 'priority': 4, 'percentage': 0.74} ], 'date': '2022-06-06T00:00:00-05:00'},
{'status':'inactive', 'categories': [ {'tax_category_code':'T001', 'priority': 0, 'percentage': 0.05}, {'tax_category_code':'T002', 'priority': 0, 'percentage': 0.41}, {'tax_category_code':'T003', 'priority': 0, 'percentage': 0.72} ], 'date': '2022-03-31T00:00:00-05:00'}

我尝试获取与tax_category_code匹配的所有项目的列表作为结果,考虑状态为的tax_schema:活动,并显示优先级和百分比:

[
{'item_code':'A001', 'tax_category_code':'T001', 'price': 98, {'priority': 1, 'percentage': 0.1} },
{'item_code':'A002', 'tax_category_code':'T002', 'price': 39, {'priority': 3, 'percentage': 0.5} },
{'item_code':'A003', 'tax_category_code':'T001', 'price': 77, {'priority': 1, 'percentage': 0.1}},
{'item_code':'A004', 'tax_category_code':'T003', 'price': 52, {'priority': 2, 'percentage': 0.87}}
]

我已经尝试了这个查询,但是我得到了每个项目上的所有tax_schema:

db.getCollection('items').aggregate([
  {
    $lookup: {
      from: 'tax_schema',
      localField: 'tax_category_code',
      foreignField: 'categories.tax_category_code',
      as: 'tax_schema',
    },
  },
  {
      $project: {
        item_code: 1,
        tax_category_code: 1,
        price: 1,
        tax_schema_category: { $arrayElemAt: ['$tax_schema.categories', 0] },
      }      
  }
])
x759pob2

x759pob21#

您不能直接使用$lookupcategories.tax_category_code,因为$lookup会被解析为数组字段。如果数组中有任何项目符合,您就会撷取数组中的所有项目。相反,您可以在子管缐中使用$unwind$match

db.items.aggregate([
  {
    "$lookup": {
      "from": "tax_schema",
      let: {
        tcc: "$tax_category_code"
      },
      pipeline: [
        {
          $match: {
            "status": "active"
          }
        },
        {
          "$unwind": "$categories"
        },
        {
          $match: {
            $expr: {
              $eq: [
                "$$tcc",
                "$categories.tax_category_code"
              ]
            }
          }
        }
      ],
      "as": "tax_schema"
    }
  },
  {
    $project: {
      item_code: 1,
      tax_category_code: 1,
      price: 1,
      tax_schema_category: {
        $arrayElemAt: [
          "$tax_schema.categories",
          0
        ]
      },
      
    }
  }
])

Mongo Playground

相关问题