【问题标题】:Combining multiple $samples in single aggregate query mongodb在单个聚合查询 mongodb 中组合多个 $samples
【发布时间】: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 个查询结果合并到一个数组中。

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

【问题讨论】:

    标签: mongodb aggregate-functions


    【解决方案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 等)中随机播放它,因为它更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多