MongoDB:在一个查询中从不同的集合中获取文档

Posted

技术标签:

【中文标题】MongoDB:在一个查询中从不同的集合中获取文档【英文标题】:MongoDB: Fetching documents from different collections in one query 【发布时间】: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",
    ...
  
]

【问题讨论】:

【参考方案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 相关的所有内容。数据聚合现在变得简单(通过比较)

【讨论】:

以上是关于MongoDB:在一个查询中从不同的集合中获取文档的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB - 查询大型集合

MongoDB:获取具有两个值的不同组合的最新文档

如何在MongoDB中从某些类别中查找特定文档

MongoDB:如何在 100 个集合中找到 10 个随机文档?

MongoDB:如何在 100 个集合中找到 10 个随机文档?

Yii,MongoDB查询子文档以插入Mysql表