数据类型 double、NumberLong、NumberInt 或 MongoDB 中的简单 Integer 之间的主要区别是什么(大小、速度等)?
如果我想保存一个小的固定数字(介于 0 和 1000 之间),我应该使用哪种数据类型?
数据类型 double、NumberLong、NumberInt 或 MongoDB 中的简单 Integer 之间的主要区别是什么(大小、速度等)?
如果我想保存一个小的固定数字(介于 0 和 1000 之间),我应该使用哪种数据类型?
整数
默认情况下,mongo shell 将所有数字视为浮点值。mongo shell 提供NumberInt()
构造函数来显式指定 32 位整数。
NumberLong
默认情况下,mongo shell 将所有数字视为浮点值。mongo shell 提供NumberLong()
类来处理 64 位整数。
构造NumberLong()
函数接受 long 作为字符串:
NumberLong("2090845886852")
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")})
都匹配插入的文档。