Mongoose返回10结果按日期排序的每个用户ID中的ID数组

发布于 2025-01-18 19:26:34 字数 930 浏览 0 评论 0原文

假设我们有一个用户 id 数组:

    "ids": [
        "623d71c628820d09797be558",
        "62419d6477775214de099838",
        "62419d7877775214de099845",
        "62419d8877775214de09984c"
    ]

我们想要返回每个 id 的前 10 个文档(按日期排序)。我知道我们可以这样做:

  const docs = await Model.find({ id: { $in: ids } })
    .sort("date")
    .limit(10);

它返回按日期排序的 10 个文档,但不是针对每个用户,我如何为数组中的每个文档返回 10 个文档?

** 编辑 **

这是来自 balance 集合的示例文档:

  {
    "_id": "624a19a0b1cf7d69a5193737",
    "user": {
      "name": "john",
      "id": "623d71c628820d09797be558"
    },
    "description": "chips",
    "amount": 2,
    "type": "expense",
    "date": "2022-04-03T22:03:12.774Z",
    "__v": 0
  }

和“用户”文档:

{
        "_id": "623d71c628820d09797be558",
        "name": "john",
        "__v": 0
}

lets say we have an array of user ids :

    "ids": [
        "623d71c628820d09797be558",
        "62419d6477775214de099838",
        "62419d7877775214de099845",
        "62419d8877775214de09984c"
    ]

and we want to return the first 10 documents of every id sorted by date. I know we can do :

  const docs = await Model.find({ id: { $in: ids } })
    .sort("date")
    .limit(10);

which returns 10 documents sorted by date,but not for every user,how could i return 10 for every one in array ?

** EDIT **

Here's an example document from the balance collection:

  {
    "_id": "624a19a0b1cf7d69a5193737",
    "user": {
      "name": "john",
      "id": "623d71c628820d09797be558"
    },
    "description": "chips",
    "amount": 2,
    "type": "expense",
    "date": "2022-04-03T22:03:12.774Z",
    "__v": 0
  }

and a "user" document :

{
        "_id": "623d71c628820d09797be558",
        "name": "john",
        "__v": 0
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

差↓一点笑了 2025-01-25 19:26:34

这是您可以使用聚合管道进行的一种方法。

db.collection.aggregate([
  {
    "$match": {
      "id": {
        "$in": [
          "623d71c628820d09797be558",
          "62419d6477775214de099838",
          "62419d7877775214de099845",
          "62419d8877775214de09984c"
        ]
      }
    }
  },
  {
    "$sort": { "date": 1 }
  },
  {
    "$group": {
      "_id": "$id",
      "docs": { "$push": "$CURRENT" }
    }
  },
  {
    "$project": {
      "_id": 0,
      "id": "$_id",
      "docs": { "$slice": [ "$docs", 10 ] }
    }
  }
])

尝试一下 mongoplayground.net.net

Here's one way you could do it using an aggregation pipeline.

db.collection.aggregate([
  {
    "$match": {
      "id": {
        "$in": [
          "623d71c628820d09797be558",
          "62419d6477775214de099838",
          "62419d7877775214de099845",
          "62419d8877775214de09984c"
        ]
      }
    }
  },
  {
    "$sort": { "date": 1 }
  },
  {
    "$group": {
      "_id": "$id",
      "docs": { "$push": "$CURRENT" }
    }
  },
  {
    "$project": {
      "_id": 0,
      "id": "$_id",
      "docs": { "$slice": [ "$docs", 10 ] }
    }
  }
])

Try it on mongoplayground.net.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文