欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

MongoDB里的NumberLong数值类型详解

最编程 2024-02-22 15:31:39
...
> use  testDB

> db.testColl.findOne()
{
        "_id" : ObjectId("63ec79364610bf82b99d23a5"),
        "pid" : "XT-db238f62-cc77-40bb-8952-9c96544dc786",
        "group" : "全部订阅用户",
        "groupUserId" : "63c0ba6de4b095b2050d9f0a",
        "type" : 1,
        "eid" : "123456",
        "createTime" : NumberLong("1676441910831"),
        "updateTime" : NumberLong("1676441910831")
}

MongoDB中NumberLong()

MongoDB中的NumberLong()是一种数据类型,它表示一个64位有符号整数。
在MongoDB中,NumberLong()用于存储大于2^31-1(即2,147,483,647)的整数值,因为MongoDB默认使用32位整数来存储数字,无法存储大于该值的数字。

NumberLong()可以在MongoDB shell中使用,可以通过以下方式创建:

NumberLong("1234567890123456789")

在MongoDB中,NumberLong()的用途非常广泛,例如在聚合操作中,可以对大数字进行计算。
例如,如果要计算一个集合中所有文档的某个字段的总和,而该字段的值可能超过2^31-1,则可以使用NumberLong()来确保计算正确。

另外,在MongoDB的驱动程序中,也可以使用NumberLong()来处理大数字。
例如,在Java中,可以使用BSONObject类的put()方法将一个NumberLong对象插入到MongoDB数据库中。

总之,NumberLong()是MongoDB中一种重要的数据类型,用于处理大数字,确保数据的准确性和完整性。

"createTime" : NumberLong("1676441910831")

这个示例中,"createTime"字段的值是一个64位有符号整数,它的值是1676441910831。由于这个数字超过了2^31-1,因此不能使用32位整数来存储它。
为了确保数据的正确性和完整性,MongoDB使用NumberLong()函数将其转换为一个64位整数,并将其存储在数据库中。

在MongoDB shell中,可以使用以下命令来查询和处理这个字段的值:

db.collection.find({"createTime": NumberLong("1676441910831")})

这将返回具有指定"createTime"值的所有文档。
注意,这种数据类型必须要在NumberLong对象里面加上双引号,才能执行正常查询动作!!!

另外,在聚合操作中,可以使用$toLong聚合操作符将一个32位整数转换为64位整数。例如:

db.collection.aggregate([
  {
    $group: {
      _id: null,
      total: { $sum: { $toLong: "$createTime" } }
    }
  }
])

这将计算集合中所有文档的"createTime"字段的总和,并将结果作为64位整数返回。

时间戳
Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

时间戳转换
https://tool.lu/timestamp

"createTime" : NumberLong("1676441910831")
"updateTime" : NumberLong("1676441910831")

image.png

在示例中,"createTime"字段的值是1676441910831,它是一个时间戳,表示从1970年1月1日至2023-02-15 14:18:30 的毫秒数。这种表示方式可以使时间戳在MongoDB中进行存储和处理时具有更高的精度和准确性。

在MongoDB shell中,可以使用以下命令将时间戳转换为日期:

new Date(NumberLong("1676441910831"))

> new Date(NumberLong("1676441910831"))
ISODate("2023-02-15T06:18:30.831Z")

这将返回一个JavaScript日期对象,表示时间戳对应的日期和时间。

ISODate("2023-02-15T06:18:30.831Z") 表示的是UTC时间,加8就是 2023-02-15 14:18:30 了。

参考

时间戳转换工具
https://tool.lu/timestamp

MongoDB中NumberLong(x)和 NumberLong("x")之间的区别
https://www.nhooo.com/note/qa0g34.html

推荐阅读