【问题标题】:MongoDB Map Reduce on object fields对象字段上的 MongoDB Map Reduce
【发布时间】:2015-07-09 09:45:28
【问题描述】:

文件如下:

{
    _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 到 3,000 个字段。这样的文档有数千个。

我希望在集合上使用 mapreduce,因此我只为集合中的每个文档返回一个事件(具有最新“创建”日期的事件)。

这可能吗?

【问题讨论】:

    标签: javascript mongodb mapreduce mongodb-query


    【解决方案1】:

    是的,这是可能的。 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 } }
    );
    

    所以基本上这会通过“事件”循环并在某种程度上重塑数据。然后你 .sort() 在“descencing order”结果的“created”键上,只需拉出第一个数组元素。

    “reducer”在这里什么都不做。但这只是服务器进行过滤的一种方式。

    【讨论】:

    • 将这两个 'obj' 引用替换为 'doc' 就成功了!
    • @Drew 我真坏。这将教我从我正在研究的参考 scipt 中剪切/粘贴。现在修好了。不错的收获
    猜你喜欢
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多