在单个聚合查询 mongodb 中组合多个 $samples

Posted

技术标签:

【中文标题】在单个聚合查询 mongodb 中组合多个 $samples【英文标题】:Combining multiple $samples in single aggregate query mongodb 【发布时间】:2021-05-27 12:28:18 【问题描述】:

我正在处理一个查询,以使用条件和样本大小从 mongodb 检索样本文档

db.getCollection('questionBank').aggregate(
   ["$match":"difficultyLevel":"Intermediate",  $sample:  size: 5   
   ]
)

db.getCollection('questionBank').aggregate(
       ["$match":"difficultyLevel":"Low",  $sample:  size: 3   
       ]
    )


db.getCollection('questionBank').aggregate(
           ["$match":"difficultyLevel":"High",  $sample:  size: 2   
           ]
        )

我想从题库中获得一组难度级别为 Immediate,5 Low,3 和 High,2 的记录 我能够使用三个单独的聚合查询来获取所有这些记录,并且我正在将 3 个查询结果合并到一个数组中。

有没有办法在单个查询中做到这一点

【问题讨论】:

【参考方案1】:

有。 $facet$project 会为你做到这一点:

db.collection.aggregate([
  
    "$facet": 
      "Intermediate": [
        
          "$match": 
            "difficultyLevel": "Intermediate"
          
        ,
        
          $sample: 
            size: 3
          
        
      ],
      "Low": [
        
          "$match": 
            "difficultyLevel": "Low"
          
        ,
        
          $sample: 
            size: 2
          
        
      ],
      "High": [
        
          "$match": 
            "difficultyLevel": "High"
          
        ,
        
          $sample: 
            size: 1
          
        
      ]
    
  ,
  
    "$project": 
      merged_results: 
        $concatArrays: [
          "$Intermediate",
          "$Low",
          "$High"
        ]
      
    
  
])

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

【讨论】:

这工作正常.. 谢谢.. 有没有办法在合并的结果中混合问题.. 到目前为止,它以中级、中级、中级、高、高、低的形式出现。有没有办法使数组随机化.. 这样问题的难度就混合了 @slaveCoder 当然有一种方法,但是您需要在 mongodb 中创建一个混洗函数并从您的聚合中调用它,这相当复杂。所以mongo聚合中没有原生的“$shuffle”方法。就个人而言,我会在应用程序(Node、php 等)中随机播放它,因为它更容易。

以上是关于在单个聚合查询 mongodb 中组合多个 $samples的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB Aggregation

是否可以在 mongodb 上聚合多个条件

MongoDB笔记 聚合(详细)

MongoDB笔记 聚合(详细)

mongoDB表与表的关系及聚合管道查询

MongoDB 单个 $lookup / 聚合查询以列出用户和用户分配为成员的团队