MongoDB对对象字段进行Map Reduce



使用如下文档:

{
    _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"什么也没做。但这只是服务器进行过滤的一种方式。

相关内容

  • 没有找到相关文章

最新更新