2014-03-28 40 views
0

我有一堆存储在MongoDB中的字段为Longs。当我查询我的集合时,它们以长整型返回。但是,当我将MapReduce执行到新的集合中并从那里检索数据时,它会作为浮点数返回。看起来尴尬的是必须将所有东西都转换为浮点数,然后获取Long值 - 有没有更好的方法?从Java中的MongoDB中检索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"}}} 

这里是我的地图和减少功能:我需要两个ID,所有的数值(除日期等)是朗斯:

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

您可能想要将您的accumulator变量声明为NumberLong(假设您正在使用内置的mapreduce) – evanchooly

+0

我不知道该怎么做。编辑原始问题以包含我的地图并减少功能。 – betseyb

+0

有一些样本输入文件? – evanchooly

回答

0

你也许可以做到这一点,如果你改变通过使用类似的东西发射器发射多余:

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

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

+0

是的,原来的物体是长条而不是浮子。偶尔Mongo会给我一个NumberLong,但只是偶尔。 – betseyb