【发布时间】:2014-06-28 21:19:24
【问题描述】:
这是我觉得有趣的 MongoDB 挑战。
给定一个时间戳集合events 和一个特定的输入选择器_object,我们如何聚合一个跟随输入的event 文档列表?
例如,Mongoose 中的 Schema:
var EventSchema = new Schema({
_object: { type: ObjectId }
, timestamp: { type: Date, default: Date.now }
});
一个示例集合:
[
{ _id: ObjectId('1'), _object: ObjectId('123abc...1', timestamp: 'Sat Jun 21 2014 16:30:01 GMT-0400 (EDT) ) }
, { _id: ObjectId('2'), _object: ObjectId('123abc...2', timestamp: 'Sat Jun 22 2014 16:30:00 GMT-0400 (EDT) ) }
, { _id: ObjectId('3'), _object: ObjectId('123abc...1', timestamp: 'Sat Jun 23 2014 16:30:01 GMT-0400 (EDT) ) }
, { _id: ObjectId('4'), _object: ObjectId('123abc...3', timestamp: 'Sat Jun 24 2014 16:30:01 GMT-0400 (EDT) ) }
, { _id: ObjectId('5'), _object: ObjectId('123abc...1', timestamp: 'Sat Jun 25 2014 16:30:01 GMT-0400 (EDT) ) }
, { _id: ObjectId('6'), _object: ObjectId('123abc...4', timestamp: 'Sat Jun 26 2014 16:30:02 GMT-0400 (EDT) ) }
, { _id: ObjectId('7'), _object: ObjectId('123abc...1', timestamp: 'Sat Jun 27 2014 16:30:00 GMT-0400 (EDT) ) }
, { _id: ObjectId('8'), _object: ObjectId('123abc...3', timestamp: 'Sat Jun 28 2014 16:30:01 GMT-0400 (EDT) ) }
, { _id: ObjectId('9'), _object: ObjectId('124abc...1', timestamp: 'Sat Jun 29 2014 16:30:00 GMT-0400 (EDT) ) }
, { _id: ObjectId('10'), _object: ObjectId('124abc...2', timestamp: 'Sat Jun 30 2014 16:30:00 GMT-0400 (EDT) ) }
]
假设我们的预期目标是ObjectId('123abc...1')。我们将使用我们的特殊方法查询我们的集合,提供序列号 1 的参数(而不是 0,元素本身):
Events.mySpecialMethod( { _object: ObjectId('123abc...1') } , 1 ).exec(function(err, output) {
console.log(output); // contains intended results (see below)
});
此类查询的预期输出是:
[
{ _id: ObjectId('2'), _object: ObjectId('123abc...2', timestamp: 'Sat Jun 22 2014 16:30:00 GMT-0400 (EDT) ) }
, { _id: ObjectId('4'), _object: ObjectId('123abc...3', timestamp: 'Sat Jun 24 2014 16:30:01 GMT-0400 (EDT) ) }
, { _id: ObjectId('6'), _object: ObjectId('123abc...4', timestamp: 'Sat Jun 26 2014 16:30:02 GMT-0400 (EDT) ) }
, { _id: ObjectId('8'), _object: ObjectId('123abc...3', timestamp: 'Sat Jun 28 2014 16:30:01 GMT-0400 (EDT) ) }
]
在这种情况下,选择我们预期结果集中的 first 元素很容易:
Event.find({ _object: ObjectId('123abc...1' }).limit(2).exec(function(err, events) {
// select the _second_ element of our result set
console.log(events[1];);
});
...但是我们如何在给定输入_object(可能有很多条目)的情况下聚合第二个元素的列表?
奖励:我们可以选择第 *n* 个元素吗?
【问题讨论】:
-
你使用什么作为你的隐含顺序? limit(2) 没有排序并不能保证它会返回你想要的。您按 _id 顺序列出文档 - 这是您期望的顺序吗?
-
@AsyaKamsky 在这种情况下,只有
_id字段中隐含的日期。更准确地说,意图是使用timestamp字段。
标签: javascript node.js mongodb mapreduce aggregation-framework