2012-02-16 8 views
2

公式Java API経由でMongoDBを使用しています。余計な労力をかけずにLong値を保存して検索することができます。しかし、これらの値をgroup()関数を使って累積しようとすると、JavaScriptインタプリタはすべてをDoublesに変換し、最終的な結果はDoubleになります。ここでDouble in MongoDB group()関数の代わりに長いアキュムレータ

は、私のグループのコマンドです:

{ 
    ... 
    initial: { count: 0 }, 
    reduce: "function (o, a) { a.count += o.count; }" 
} 

countが実際に長いというインタプリタを伝える方法はありますか? count: 0Lcount: Long(0)のようなもの?または、私はJava側で蓄積を行うべきですか?

答えて

2

これは、groupコマンドが実際にmap/reduceを実行し、map/reduceがjavascriptであるためです。 javascriptのデフォルトの数値型はdouble型です。これはdouble型になります。

あなたはgroupコマンド結果に長く見たいのであれば、あなたはおそらくNumberLong(..)であなたの番号をラップすることができます

{ 
    ... 
    initial: { count: new NumberLong(0) }, 
    reduce: "function (o, a) { a.count += new NumberLong(o.count); }" 
} 

はこれをテストし、それが動作する必要があることはほとんどわかりません。

+0

お返事ありがとうございます。残念ながら 'NumberLong'は動作しませんでした:" 'ReferenceError:NumberLong is defined'"それはMongoDBのドキュメント自体に言及しているので奇妙です:http://www.mongodb.org/display/DOCS/Data+Types+and+Conventions –

+0

@EserAygün:グループの代わりにm/rを使用してみてください。 mongodbシェルを使用して、どこに問題があるのか​​を知ることができます。 –

+0

ああ!バージョン1.2.2がインストールされていることが判明しました。それはおそらくそれがうまくいかなかった理由です。再度、感謝します! –

関連する問題