使用如下文档:
{
_id: 123,
events: {
someEvent:{
created: ISODate("2015-06-27T16:51:03.000Z"),
metadata: {
some: "thing"
}
},
anotherEvent:{
created: ISODate("2015-06-27T16:51:01.000Z"),
metadata: {
some: "thing"
}
}
}
}
这是一个简化的数据示例。事件对象可以有200到3000个字段。像这样的文件有成千上万。
我希望在集合上使用mapreduce,所以我只返回集合中每个文档的一个事件(具有最新"创建"日期的事件)。
这可能吗?
这是可能的。MapReduce是一把"钝刃剑",但你的元素结构"不太好",可能有3000个元素需要这样的东西:
db.collection.mapReduce(
function() {
var doc = this;
var plucked = Object.keys(doc.events)
.map(function(key) {
var myObj = doc.events[key];
myObj.key = key;
return myObj;
})
.sort(function(a,b) {
return ( a.created > b.created )
? -1 : ( a.created < b.created )
? 1 : 0;
})[0];
emit(this._id, plucked);
},
function() {},
{ "out": { "inline": 1 } }
);
基本上,它通过"事件"循环并在一定程度上重塑了数据。然后按"降序"对结果的"created"键进行.sort()
,并只拉第一个数组元素。
这里的"reducer"什么也没做。但这只是服务器进行过滤的一种方式。