使用组聚合时,数据类型从Int更改为Float

时间:2011-05-25 14:05:14

标签: scala mongodb casbah

我正在尝试使用群组聚合。

我的mongodb中有以下结构的文档:

{ "_id" : ObjectId("4ddcdc9ab4d8a3a90345508e"), "vehicleId" : "1", "timestamp" : ISODate("2011-05-25T10:40:25.856Z"), "speed" : 1 }

{ "_id" : ObjectId("4ddcdc9ab4d8a3a90345508f"), "vehicleId" : "2", "timestamp" : ISODate("2011-05-25T10:40:26.232Z"), "speed" : 2 }

在测试中,我想获得每辆车的最新速度,即我 执行以下操作:

val key = MongoDBObject("vehicleId" -> true)
val cond = MongoDBObject.empty
val initial = MongoDBObject("timestamp" -> 0)

val reduce =
  """function(doc, prev) {
       if (doc.timestamp > prev.timestamp) {
          prev.speed = doc.speed;
          prev.timestamp = doc.timestamp;
       }
     }"""

val groupedSpeed = collection.group(key, cond, initial, reduce)

for (dbObject: DBObject <- groupedSpeed) {
  println(dbObject.toString)

奇怪的是,在集合groupsSpeed中,该字段 速度不再是Int:

{ "vehicleId" : "2" , "timestamp" : { "$date" : "2011-05-25T10:40:49Z"} , "speed" : 2.0}
{ "vehicleId" : "1" , "timestamp" : { "$date" : "2011-05-25T10:40:49Z"} , "speed" : 1.0}

我错过了什么吗?我正在使用casbah 2.1.2。

干杯,   基督徒

[更新] 在javascript和bson中看起来这是正常的,请参阅此处:casbah mailing list

1 个答案:

答案 0 :(得分:0)

Javascript将所有数值表示为双精度。

您可能希望扩展应用程序逻辑,以便在插入新文档时,在单独的集合中还更新该车辆的最大速度,这样您就不必进行组查询。