从Java中检索MongoDB中的长值

时间:2014-03-28 18:05:07

标签: java json mongodb mapreduce

我有一堆字段存储在MongoDB中作为Longs。当我查询我的集合时,它们将作为Longs返回。但是,当我将MapReduce执行到新集合并从那里检索数据时,它会以浮动状态返回。将所有内容都转换为浮动然后获取Long值似乎很尴尬 - 有更好的方法吗?

A sample object:
{ "_id" : 2836.0 , "value" : { "friends_count" : 788.0 , "followers_count" : 910.0 , "tweet_count" : 7791.0 , "screen_name" : "zzzzz" , "collected_at" : { "$date" : "2014-01-01T14:47:41.000Z"}}}

这是我的map和reduce函数:我需要id和所有数值(除了date)都是Longs:

String map = "function() { " +
            "emit( this.user_id, { 'friends_count': this.friends_count, 'followers_count': this.followers_count, " +
            "'tweet_count': this.tweet_count, 'screen_name': this.screen_name, 'collected_at': this.collected_at} );}";

String reduce = "function(key, values) { " +
             "var retval = values[0]; " +
             "var latest = 0; "+
             "for(var i in values){ " +
                "if(values[i].collected_at > latest) { " +
                    "latest = values[i].collected_at; "+
                    "retval = values[i]; "+
            "   }} "+
            "return retval;}";

1 个答案:

答案 0 :(得分:0)

如果您通过使用以下内容将发射器更改为发射长度,则可以执行此操作:

emit(this.user_id, { friends_count: NumberLong(this.friends_count), /* ... */ });
但是,MongoDB不会保留现有的类型,这很奇怪。确保原始对象上的字段类型确实是long(您提供的对象浮动在其中,我假设它是一个示例输出对象而不是输入)。