我想完全按照SO question获得的内容,但在服务器端使用Meteor:
如何检索具有唯一a值的所有文档 场?
> db.foo.insert([{age: 21, name: 'bob'}, {age: 21, name: 'sally'}, {age: 30, name: 'Jim'}])
> db.foo.count()
3
> db.foo.aggregate({ $group: { _id: '$age', name: { $max: '$name' } } }).result
[
{
"_id" : 30,
"name" : "Jim"
},
{
"_id" : 21,
"name" : "sally"
}
]
我的理解是,aggregate
不适用于Meteor。如果这是正确的,我怎样才能实现上述目标?事后对查询执行后置过滤不是理想的解决方案,因为我想使用limit
。只要我可以使用limit
,我也很乐意以其他方式获取具有唯一字段的文档。
答案 0 :(得分:1)
您可以使用常规设置来访问底层驱动程序集合对象,因此.aggregate()
无需安装任何其他插件。
基本过程如下:
FooAges = new Meteor.Collection("fooAges");
Meteor.publish("fooAgeQuery", function(args) {
var sub = this;
var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
var pipeline = [
{ "$group": {
"_id": "$age",
"name": { "$max": "$name" }
}}
];
db.collection("foo").aggregate(
pipeline,
// Need to wrap the callback so it gets called in a Fiber.
Meteor.bindEnvironment(
function(err, result) {
// Add each of the results to the subscription.
_.each(result, function(e) {
// Generate a random disposable id for aggregated documents
sub.added("fooAges", Random.id(), {
"age": e._id,
"name": e.name
});
});
sub.ready();
},
function(error) {
Meteor._debug( "Error doing aggregation: " + error);
}
)
);
});
因此,您为聚合的输出定义了一个集合,并在这样的例程中,然后发布您将在客户端中订阅的服务。
在此内部,聚合运行并填充到另一个集合中(逻辑上它实际上并没有写任何东西)。然后,您在客户端上使用具有相同定义的集合,并且只返回所有聚合结果。
如果您需要进一步参考,我实际上在this question内有一个类似流程的完整工作示例应用,以及meteor hacks aggregate上this question包的使用情况。