You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB聚合查询:从多文档中筛选指定对象

MongoDB聚合查询:匹配产品标签对应的维度对象

先明确集合示例结构,方便理解:

  • Collection1(命名为dimensionsCollection)文档结构:
{
  "_id": "col1_doc1",
  "dimension": [
    { "_id": "dim_1", "dimensionChild": "尺寸A" },
    { "_id": "dim_2", "dimensionChild": "尺寸B" },
    { "_id": "dim_3", "dimensionChild": "尺寸C" }
  ]
}
  • Collection2(命名为productsCollection)文档结构:
{
  "_id": "prod1",
  "productTags": ["dim_1", "dim_3", "other_tag_1"]
}

方案一:从产品集合发起查询(获取指定产品的匹配维度)

如果要针对某款产品,提取其productTags对应的维度对象,用以下聚合管道:

db.productsCollection.aggregate([
  // 可选:仅查询特定产品,移除则返回所有产品的匹配结果
  { $match: { _id: "prod1" } },
  {
    $lookup: {
      from: "dimensionsCollection",
      let: { tagIds: "$productTags" },
      pipeline: [
        // 将dimension数组拆分为独立文档
        { $unwind: "$dimension" },
        // 筛选出_id在productTags中的维度项
        { $match: { $expr: { $in: ["$dimension._id", "$$tagIds"] } } },
        // 将维度对象作为根文档返回
        { $replaceRoot: { newRoot: "$dimension" } }
      ],
      as: "matchedDimensions"
    }
  },
  // 可选:仅保留维度列表,移除产品其他字段
  { $project: { matchedDimensions: 1, _id: 0 } }
])

方案二:从维度集合发起查询(获取所有被引用的维度)

如果要找出所有被产品标签引用过的维度对象,用以下聚合管道:

db.dimensionsCollection.aggregate([
  // 将dimension数组拆分为独立文档
  { $unwind: "$dimension" },
  {
    $lookup: {
      from: "productsCollection",
      localField: "dimension._id",
      foreignField: "productTags",
      as: "matchedProducts"
    }
  },
  // 仅保留存在匹配产品的维度项
  { $match: { "matchedProducts.0": { $exists: true } } },
  // 提取维度对象
  { $replaceRoot: { newRoot: "$dimension" } },
  // 可选:去重(同一维度被多产品引用时避免重复)
  { $group: { _id: "$_id", dimensionChild: { $first: "$dimensionChild" } } }
])

错误原因说明

之前的查询返回所有维度,是因为$lookup仅关联了Collection1,但未对dimension数组做筛选。核心要在$lookup的内部管道中先拆分数组,再通过$in匹配标签ID,或在关联后筛选出有匹配项的结果。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:25:05