我遇到了 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
阶段无法正常工作并提供此问题的解决方案吗?
提前感谢您的协助
在 mongo 查询语言中,如果数组包含该值,则单个项目与数组的相等匹配将返回 true。
这意味着您可以使用关联形式的查找,并避免有时会混淆索引使用的 $expr 表达式。
db.offers.aggregate([
{$match: {
type: "TYPE_1",
version: "VERSION_1"
}},
{$lookup: {
from: "arts",
localField: "_id",
foreignField: "linkedOffers.include.offerId",
as: "linkedArts"
}}
])