数据类型 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")})
都匹配插入的文档。