美文网首页mongodb
【mongoDB】MongoDB 根据NumberLong()

【mongoDB】MongoDB 根据NumberLong()

作者: Bogon | 来源:发表于2024-08-08 23:20 被阅读0次

    解读一下 MongoDB 这条数据

    > use testDB
    
    > db.T_Test.find({"groupId": "6194c0892d0ec58d421c02a2"})
    
    { "_id" : ObjectId("6194c0893617f8045b953f6a"), "groupId" : "6194c0892d0ec58d421c02a2", "msgId" : "6194c0892d0ec58d421c02a3", "score" : NumberLong("1637138569166") }
    

    这条 MongoDB 数据记录包含了一个消息的相关信息。
    让我们逐项解析每个字段的含义:

    1. _id: ObjectId("6194c0893617f8045b953f6a")

      • 这是 MongoDB 自动生成的唯一标识符。每条记录都有一个 _id 字段,用于唯一标识这条记录。
    2. groupId: "6194c0892d0ec58d421c02a2"

      • 这是一个表示群组的唯一标识符。这里的 groupId 显示这是属于某个特定群组的消息。
    3. msgId: "6194c0892d0ec58d421c02a3"

      • 这是消息的唯一标识符,表示每条消息的唯一性。
    4. score: NumberLong("1637138569166")

      • 这是一个时间戳或分数。由于它的数值较大,可能是时间戳(以毫秒为单位),表示消息的创建时间或相关时间点。这个数值可以转换成更易读的日期时间格式。

    总结起来,这条数据记录了一个特定群组中一条消息的唯一标识符、消息标识符以及一个与时间或分数相关的长整型数值。如果需要具体时间,可以将 score 字段的数值转换为标准的日期时间格式。

    MongoDB中的NumberLong是一个64位的整数类型,用于存储大于Number.MAX_SAFE_INTEGER(即2^53 - 1)的整数值。这个类型通常用于时间戳,因为时间通常是以毫秒为单位,而JavaScript中的Number类型只能安全地处理Number.MAX_SAFE_INTEGER毫秒(即约为1.7亿年)内的数值。

    当你在MongoDB shell中看到NumberLong类型的数据时,可以直接将其视为一个普通的JavaScript数字,因为MongoDB shell会自动将NumberLong转换为JavaScript中的number类型。

    如果你在JavaScript代码中需要使用NumberLong,你可以在插入数据时显式地指定数据类型,例如:

    db.collection.insertOne({
    score: NumberLong("1637138569166")
    });

    或者,在查询时,MongoDB会自动将NumberLong转换为JavaScript中的number类型,你可以像处理普通JavaScript数字一样处理它。例如:

    db.collection.find({
    score: { $gt: 1637138569166 }
    });

    在上面的查询中,即使score字段在MongoDB中是以NumberLong形式存储的,你仍然可以使用普通的JavaScript数字进行比较。

    如何从这张表根据 "groupId": "6194c0892d0ec58d421c02a2" 和 "score" 大于 2024-07-07 小于2024-08-07 ?

    要从 MongoDB 中查询特定 groupId 并且 score 字段的值在两个日期之间的记录,首先需要将日期转换为时间戳(以毫秒为单位)。

    工具 › 开发类 › 时间戳转换
    https://tool.lu/timestamp/

    image.png

    将转换后的时间戳值插入到 MongoDB 查询中,以 NumberLong 类型存储的,那么查询语句如下:

    db.T_Test.find({
      "groupId": "6194c0892d0ec58d421c02a2",
      "score": {
        $gt: NumberLong("xxxxxx"), // 2024-07-07 的时间戳
        $lt: NumberLong("xxxxxx")  // 2024-08-07 的时间戳
      }
    });
    
    > use testDB
    > db.T_Test.count({   "groupId": "6194c0892d0ec58d421c02a2",    "score": {  $gt: NumberLong("1720281600000"),   $lt: NumberLong("1722960000000")}   });
    6
    > db.T_Test.find({  "groupId": "6194c0892d0ec58d421c02a2",    "score": {     $gt: NumberLong("1720281600000"),      $lt: NumberLong("1722960000000")     } });
    { "_id" : ObjectId("66a73507f7f00024c15f8fa5"), "groupId" : "6194c0892d0ec58d421c02a2", "msgId" : "66a735072d0ecf8ec0bb3d21", "score" : NumberLong("1722234119126") }
    { "_id" : ObjectId("66a734f0f7f00024c15f8fa2"), "groupId" : "6194c0892d0ec58d421c02a2", "msgId" : "66a734f02d0ecf8ec0bb3ca5", "score" : NumberLong("1722234096837") }
    { "_id" : ObjectId("66a72fe49b6a9e46f54c5dc9"), "groupId" : "6194c0892d0ec58d421c02a2", "msgId" : "66a72fe42d0e0e69ac715d6b", "score" : NumberLong("1722232804728") }
    { "_id" : ObjectId("66a72f9bf7f00024c15f8f27"), "groupId" : "6194c0892d0ec58d421c02a2", "msgId" : "66a72f9b2d0ecf8ec0bb2487", "score" : NumberLong("1722232731897") }
    { "_id" : ObjectId("66a72e35f7f00024c15f8f19"), "groupId" : "6194c0892d0ec58d421c02a2", "msgId" : "66a72e352d0ecf8ec0bb2093", "score" : NumberLong("1722232373316") }
    { "_id" : ObjectId("669a0b0ef7f00024c15f60f9"), "groupId" : "6194c0892d0ec58d421c02a2", "msgId" : "669a0b0e2d0ecf8ec0adbe76", "score" : NumberLong("1721371406025") }
    

    解释

    • $gt: 大于(greater than),用来找出 score 大于 2024-07-07 的时间戳。
    • $lt: 小于(less than),用来找出 score 小于 2024-08-07 的时间戳。

    这样可以有效地筛选出在指定日期范围内的记录。

    参考

    mongoDB中的NumberLong()数据类型
    https://www.jianshu.com/p/6519424ff86e

    相关文章

      网友评论

        本文标题:【mongoDB】MongoDB 根据NumberLong()

        本文链接:https://www.haomeiwen.com/subject/ssuhkjtx.html