数据类型double,NumberLong,NumberInt或MongoDB中的简单Integer之间的主要区别(大小,速度等)是什么?
如果我想保存一个小的固定数字(介于0到1000之间),我应该使用哪种数据类型?
答案 0 :(得分:21)
<强> NumberInt 强>
默认情况下,mongo shell将所有数字视为浮点值。 mongo shell提供NumberInt()
构造函数来显式指定32位整数。
<强> NumberLong 强>
默认情况下,mongo shell将所有数字视为浮点值。 mongo shell提供NumberLong()
类来处理64位整数。
NumberLong()
构造函数接受long作为字符串:
NumberLong("2090845886852")
答案 1 :(得分:14)
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驱动程序提供了插入不同类型数字的不同方法。例如,如果你追加一个长的长整数,C ++驱动程序会创建一个64位的整数。值为BSONObjectBuilder。
只要数字相等,查询就会匹配。在上面的示例中,查询
> 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")})
全部匹配插入的文档。