在单个聚合查询 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的主要内容,如果未能解决你的问题,请参考以下文章