在Java中从MongoDB检索长值

在Java中从MongoDB检索长值,java,json,mongodb,mapreduce,Java,Json,Mongodb,Mapreduce,我在MongoDB中存储了大量字段作为long。当我查询我的集合时,它们将作为long返回。但是,当我在一个新集合中执行MapReduce并从那里检索数据时,它会以浮点形式返回。把所有的东西都抛到一个浮点数上,然后抓住长期价值,这似乎很尴尬——有更好的方法吗 A sample object: { "_id" : 2836.0 , "value" : { "friends_count" : 788.0 , "followers_count" : 910.0 , "tweet_count" : 77

我在MongoDB中存储了大量字段作为long。当我查询我的集合时,它们将作为long返回。但是,当我在一个新集合中执行MapReduce并从那里检索数据时,它会以浮点形式返回。把所有的东西都抛到一个浮点数上,然后抓住长期价值,这似乎很尴尬——有更好的方法吗

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和所有数值(日期除外)都是long:

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;}";

如果使用以下方法将发射器更改为发射长,则可能可以执行此操作:

emit(this.user_id, { friends_count: NumberLong(this.friends_count), /* ... */ });

奇怪的是MongoDB不会保留现有的类型。确保原始对象上的字段类型确实是
long
(您提供的对象中有浮动,我假设这是一个示例输出对象,而不是输入)

您可能想将reduce中的accumlator变量声明为NumberLong(假设您使用的是内置的mapreduce),但我不知道该怎么做。编辑原始问题以包含“我的地图”和“减少”函数。是否有一些示例输入文档?是的,原始对象是长的,而不是浮点数。偶尔Mongo会给我一个很长的号码,但只是偶尔。