【问题标题】:MongoDB: Fetching documents from different collections in one queryMongoDB:在一个查询中从不同的集合中获取文档
【发布时间】:2021-09-23 10:58:52
【问题描述】:

我为两种不同类型的产品提供了两个不同的系列。现在,我想从两个集合中为特定用户获取所有文档。

我知道我可以对每个集合进行 2 个查询,在服务器端合并它们并将结果发送给用户。这样做的缺点是我必须从两个集合中为用户获取所有文档,这不利于分页。这就是为什么我想在一个查询中完成,所以我也可以将分页逻辑留给 MongoDB。

这是集合和预期结果的示例:

Products_type_1

[
  {
    "name": "product_1",
    "user": "user_1",
    ...
  },
  {
    "name": "product_2",
    "user": "user_2",
    ...
  }
]

Products_type_2

[
  {
    "name": "product_3",
    "user": "user_1",
    ...
  },
  {
    "name": "product_4",
    "user": "user_2",
    ...
  }
]

预期结果:

[
  {
    "type": "Products_type_1",
    "name": "product_1",
    "user": "user_1",
    ...
  },
  {
    "type": "Products_type_2",
    "name": "product_3",
    "user": "user_1",
    ...
  }
]

【问题讨论】:

    标签: javascript node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    您可以将聚合框架与$unionWith 阶段一起使用:

    db.Products_type_1.aggregate([
      {
        "$match": {
          "user": "user_1"
        }
      },
      {
        $unionWith: {
          coll: "Products_type_2",
          pipeline: [
            {
              "$match": {
                "user": "user_1"
              }
            }
          ]
        }
      }
    ])
    

    游乐场:https://mongoplayground.net/p/v0dKCwiKsZU

    如果要使用分页,则需要添加排序阶段以确保结果中文档的顺序一致。

    【讨论】:

      【解决方案2】:

      首先,我会查询为不同的“product_type_x”设置不同集合的逻辑。如果您有一个带有添加字段的集合...

      { "productType" : 1,
        ...
      },
      

      这样就解决了这个问题,现在可以在一个集合中访问与 Procts 相关的所有内容。数据聚合现在变得简单(通过比较)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-22
        • 2016-11-26
        • 1970-01-01
        • 2019-06-15
        • 2020-07-15
        • 2013-07-12
        • 2020-12-12
        • 1970-01-01
        相关资源
        最近更新 更多