2

グループ集計を使用しようとしています。

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 }

テストでは、vehicleId ごとに最新の速度を取得したいと考えています。つまり、次のことを行っています。

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)

奇妙なことに、コレクション groupedSpeed では、フィールドの速度が 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 メーリング リスト

4

1 に答える 1

0

Javascript はすべての数値を double として表します。

アプリケーション ロジックを拡張して、新しいドキュメントが挿入されるたびに、別のコレクションでその車両の最大速度も更新するようにすると、グループ クエリを実行する必要がなくなります。

于 2011-06-14T11:45:11.840 に答える