【问题标题】:Get the old and recent documents from a non-incremental index (indexed documents)从非增量索引(索引文档)中获取旧文档和最新文档
【发布时间】:2021-09-13 04:06:22
【问题描述】:

目前我得到了给定日期的旧文件和新文件。但是,如果有多个文档具有相同的日期并且我的意图是使用“分页”,这可能是一个问题。这就是为什么我想通过使用 id 来改变它。此 id 是唯一且随机的。我想使用文档的id而不是使用特定的日期来获取相邻的索引文档,并最终得到相同的结果。

目前数据库索引如下:

{
  "CreatedAt": -1
}

当前代码:

db.collection.aggregate([
  {
    "$facet": {
      "old": [
        {
          "$match": {
            "createdAt": {
              "$lt": ISODate("2021-03-28T03:28:21.000Z")
            }
          }
        },
        {
          $limit: 2
        }
      ],
      "new": [
        {
          "$match": {
            "createdAt": {
              "$gt": ISODate("2021-03-28T03:28:21.000Z")
            }
          }
        },
        {
          $limit: 2
        }
      ]
    }
  }
])

游乐场:https://mongoplayground.net/p/YstxY2qc5Mq

是否可以使用文档“id”而不是“createdAt”来实现?

非常感谢您。

【问题讨论】:

    标签: mongodb mongoose indexing


    【解决方案1】:

    首先,我认为您需要使用 {gte & lt) 或 (gt & lte) 否则您将丢失与您的时间戳匹配的记录。其次,默认 _id 被索引,如果您使用默认 _id 即 ObjectId,那么尽管时间戳相同,但如果您按 _id 或 createdAt 排序,它将按插入顺序排列。

    此外,如果您需要给定时间最近的旧和最近的新,那么您可以使用以下方法: https://mongoplayground.net/p/arimc8YjJit

    如果您需要同时对文档进行排序,则使用 _id 和 createdAt https://mongoplayground.net/p/LpI0hPTkvKC 进行排序

    【讨论】:

    • [1/3] 我想保存最后一条消息的 id,然后用它来查询该消息中的新旧消息。我不想使用“createdAt”字段进行查询,因为可以是多个具有相同“createdAt”字段的消息,如果我想进行分页,我需要使用唯一字段不要在后面的页面中检索相同的消息。
    • [2/3] 假设有 4 条消息“createdAt”等于 (11/11/2021 12:12:12),id 从 2-5: *createdAt: 10/ 09/2021 10:03:21, id = 1 *createdAt: 11/11/2021 12:12:12, id = 2 *createdAt: 11/11/2021 12:12:12, id = 3 *createdAt: 11 /11/2021 12:12:12, id = 4 *createdAt: 11/11/2021 12:12:12, id = 5 *createdAt: 12/12/2021 05:05:03, id = 6 检索 1 条消息$lt 11/11/2021 12:12:12 和 1 $gte 12:12:12 将得到以下结果: *createdAt: 10/09/2021 10:03:21, id = 1 *createdAt: 11/11/ 2021 12:12:12,id = 2
    • [3/3] 现在我想做下一个分页,问题是如果我们使用日期,它将使用另一个时间 11/11/2021 12:12:12 并且会得到相同的结果: *createdAt: 11/11/2021 12:12:12, id = 3 *createdAt: 11/11/2021 12:12:12, id = 4
    • 好吧,假设您想获取时间 11/11/2021 12:12:12 的数据,那么您将获得该时间戳的最大 ID 并基于 _id 运行聚合(在本例中为 5) mongoplayground.net/p/w_bDKmiP0Fg 第一个是使用跳过限制,这里对于每一页你将跳过 n*page size 这里页面大小是 2 (limit =2),所以对于第一个页面跳过是 0,第 2 页是 1*2 =2 对于页面3 它的 2*2=4 依此类推..如果您不想跳过,那么您需要跟踪新的最大 id 和旧的最小 id,例如对于第 2 页,您将使用 lt 4 & gt 7并再次根据结果,您将跟踪新的最小最大 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    相关资源
    最近更新 更多