19

数据类型 double、NumberLong、NumberInt 或 MongoDB 中的简单 Integer 之间的主要区别是什么(大小、速度等)?

如果我想保存一个小的固定数字(介于 0 和 1000 之间),我应该使用哪种数据类型?

4

2 回答 2

31

整数

默认情况下,mongo shell 将所有数字视为浮点值。mongo shell 提供NumberInt()构造函数来显式指定 32 位整数。

NumberLong

默认情况下,mongo shell 将所有数字视为浮点值。mongo shell 提供NumberLong()类来处理 64 位整数。

构造NumberLong()函数接受 long 作为字符串:

NumberLong("2090845886852")

来源:http ://docs.mongodb.org/manual/core/shell-types/

于 2013-06-19T07:31:27.147 回答
22

NumberLong并且NumberInt不是 MongoDB 中的数据类型,而是 MongoDB shell 中的 JavaScript 函数。

MongoDB 中的数据类型在 BSON 规范中定义:http: //bsonspec.org/spec.html

数字存储为类型 0x01(浮点)、类型 0x10(32 位整数)或类型 0x12(64 位整数)。

如果您在 MongoDB shell 中插入或更新文档,则NumberLong创建一个 64 位整数,NumberInt创建一个 32 位整数,然后一个常规 JavaScript 数字创建一个浮点值。这是因为 JavaScript 中没有整数,只有浮点数。

MongoDB shell 中的输出将浮点数和 32 位整数显示为 JavaScript 数字,而 64 位整数显示为对 的调用NumberLong

> db.inttest.insert({f: 1234, i: NumberInt("1234"), l: NumberLong("1234")})
> db.inttest.findOne()
{
        "_id" : ObjectId("5396fc0db8e0b3e2dedb59b0"),
        "f" : 1234,
        "i" : 1234,
        "l" : NumberLong(1234)
}

不同的 MongoDB 驱动程序提供了不同的方法来插入不同类型的数字。例如,如果将long long值附加到 BSONObjectBuilder,C++ 驱动程序会创建一个 64 位整数。

只要数字相等,查询就会匹配。在上面的示例中,查询

> db.inttest.find({i:1234})
> db.inttest.find({l:1234})
> db.inttest.find({f:1234})
> db.inttest.find({i:NumberLong("1234")})
> db.inttest.find({l:NumberLong("1234")})
> db.inttest.find({f:NumberLong("1234")})

都匹配插入的文档。

于 2014-06-10T13:05:36.393 回答