MongoDB group() 函数中使用 Long 累加器代替 Double

发布于 2025-01-06 11:04:13 字数 394 浏览 1 评论 0原文

我通过官方 Java API 使用 MongoDB。我可以存储和检索 Long 值,无需任何额外的努力。但是当我尝试使用group()函数累积这些值时,JavaScript解释器将所有内容转换为双精度数,最终结果是双精度数。

这是我的组命令:

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

有没有办法告诉解释器 count 实际上是一个 Long?像 count: 0Lcount: Long(0) 之类的东西?还是应该在Java端做积累?

I am using MongoDB via official Java API. I can store and retrive Long values without any extra effort. But when I try to accumulate these values using group() function, JavaScript interpreter converts everything into Doubles and the final result ends up being a Double.

Here is my group command:

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

Is there a way to tell the interpreter that count is in fact a Long? Something like count: 0L or count: Long(0)? Or should I do the accumulation on Java side?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一个人练习一个人 2025-01-13 11:04:13

这是因为group命令实际上运行map/reduce,而map/reduce是一个javascript。在 javascript 中,默认数字类型是 double,因此它返回 double。

因此,如果您想在组命令结果中看到 long,您可以用 NumberLong(..) 包装您的数字:

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

未对此进行测试,但几乎可以肯定它应该有效。

This is because group command actually run map/reduce, and map/reduce is a javascript. In the javascript default number type is a double, because of this it return doubles.

So you can probably wrap your numbers with NumberLong(..) if you wanna see long in group command result:

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

Not tested this, but almost sure that it should work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文