MongoDB查询问题:如何筛选状态为CANCELED且买家不在产品buyers数组的交易
问题原因分析
你的查询不生效主要有两个核心问题:
$lookup返回的as字段结果永远是数组类型,哪怕只有一条匹配的产品数据也会被包裹在数组中,直接访问$product.buyers.buyer实际拿到的是嵌套数组结构,无法直接和单个用户ID做比较。$ne运算符仅能判断两个单一值是否不相等,无法实现「单个值不存在于数组中」的判断逻辑。
修正后的查询语句
db.transactions.aggregate([ // 第一步:筛选状态为CANCELED的交易 { $match: { status: 'CANCELED' } }, // 第二步:关联products集合获取对应产品数据 { $lookup: { from: 'products', localField: 'product', foreignField: '_id', as: 'linked_products' } }, // 第三步:提取唯一匹配的产品数据(外键关联只会有且仅有一条匹配结果) { $addFields: { product_info: { $arrayElemAt: ["$linked_products", 0] } } }, // 第四步:过滤买家不存在于产品buyers数组的交易 { $match: { $expr: { $nin: ["$user", "$product_info.buyers.buyer"] } } }, // 可选步骤:删除聚合过程中产生的临时字段 { $unset: ["linked_products", "product_info"] } ])
如果你不需要关联不到对应产品的交易被返回,只需要在第四步的$match中额外增加product_info: { $ne: null }的条件即可。
内容的提问来源于stack exchange,提问作者Victor Assis
相关产品推荐
相关产品推荐

