NumberLong和简单Integer之间的MongoDB差异?

时间:2013-06-19 07:25:09

标签: mongodb

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

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

2 个答案:

答案 0 :(得分:21)

<强> NumberInt

默认情况下,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/

答案 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")})

全部匹配插入的文档。