MongoDB Map减少对象字段

时间:2015-07-09 09:45:29

标签: javascript mongodb mapreduce mongodb-query

使用以下文件:

{
    _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"
            }
        }
    }
}

这是数据的简化示例。 events对象可以包含200到3,000个字段。有成千上万的这样的文件。

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

这可能吗?

1 个答案:

答案 0 :(得分:2)

是的,这是可能的。 MapReduce是一把直刃剑"为此,但你的元素结构是不是很好"可能的3000个元素需要这样的东西:

NSDictionary *postDict = @{
            @"UserPhone" : @"39399393",
            @"firstName" : @"Manohar",
            .... 
    };
AFURLRequestSerialization *serializer = [AFURLRequestSerialization serializer];
NSString *urlString = @"https://YOUR_URL";
NSError *error = nil;
NSMutableURLRequest *request = [serializer requestWithMethod:@"POST"                    
                                                   URLString:urlString
                                                  parameters:postDict
                                                       error:error];

if (error) {
  // check error
}

// Your custom http-header values
[request setValue:@"VALUE" forHTTPHeaderField:@"KEY"];

// send request
[NSURLConnection sendAsynchronousRequest:....];

所以基本上是圆柱形的,而且#34;事件&#34;并在一定程度上重塑数据。然后你{&#34;创建&#34;} 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 } } ); &#34; descencing order&#34;结果的关键然后拉第一个数组元素。

&#34;减速机&#34;这里什么也没做。但这只是服务器进行过滤的一种方式。