获取每个 MongoDB 聚合组的样本

Mou*_*ouz 5 mongodb mongodb-query aggregation-framework

我有一个 MongoDB 文档集合,它有两个属性:类型和值。

[
  {type: "A", value: "1"},
  {type: "A", value: "2"},
  {type: "B", value: "1"},
  {type: "B", value: "2"},
  {type: "C", value: "1"},
  {type: "C", value: "2"}
]
Run Code Online (Sandbox Code Playgroud)

如何在不涉及任何 JavaScript 的情况下使用单个查询获取每种类型的随机文档?

我试图用聚合框架找出一些东西

db.collection.aggregate([
  {$group: {_id: "$type", item: {$push: "$$ROOT"}}},
  {$sample: {size: 1}}
]);
Run Code Online (Sandbox Code Playgroud)

它不会对每组应用抽样,而只是选择其中一个组。

Ber*_*tel 2

或者,您可以迭代所有分组元素并以另一种方式处理随机数$sample

db.collection.aggregate([
    { $group: { _id: "$type", item: { $push: "$$ROOT" } } }
]).forEach(function(data) {
    var rand = data.item[Math.floor(Math.random() * data.item.length)];
    // insert in a new collection if needed
    // db.results.insert(rand);
    printjson(rand);
});
Run Code Online (Sandbox Code Playgroud)

从数组中选取随机元素:从 JavaScript 数组中获取随机值

type如果您的集合中有很大的不同值,则此解决方案可能会很慢,因为它不使用聚合