在mongoose中按组搜索并根据条件查找(Node、Express)

oxcyiej7  于 2023-06-23  发布在  Go
关注(0)|答案(1)|浏览(104)
"express": "^4.18.2",
    "mongodb": "^5.6.0",
    "mongoose": "^7.2.2",

我有一个运行在Node之上的Express上的服务器,并使用Mongoose来处理MongoDB。我在MongoDB中的一个集合有这样的结构:

[
  ...
  ...
  ...,
  {
  _id: 64817b7d47af9b7e12e6cb5b
  userId: 647f8f9037c28e47a23c02c0
  flips: 19
  milliseconds: 18616
  updatedAt: 2023-06-12T10:00:40.833+00:00
  __v: 0
  },
  {
  _id: 64817b7d47af9b7e12e6cb5c
  userId: 647f8f9037c28e47a23c02c0
  flips: 20
  milliseconds: 18616
  updatedAt: 2023-06-12T10:00:40.833+00:00
  __v: 0
  },
  {
  _id: 64817b7d47af9b7e12e6cb5d
  userId: 647f8f9037c28e47a23c02c1
  flips: 19
  milliseconds: 18616
  updatedAt: 2023-06-12T10:00:40.833+00:00
  __v: 0
  },
  {
  _id: 64817b7d47af9b7e12e6cb5e
  userId: 647f8f9037c28e47a23c02c1
  flips: 19
  milliseconds: 18716
  updatedAt: 2023-06-12T10:00:40.833+00:00
  __v: 0
  },
  ...
  ...
  ...
]

此集合保留了所有用户的5个最佳分数。
我想要的是做一个查询,要求Mongoose根据毫秒为每个userId返回最佳分数。如果毫秒相等,则基于翻转,如果翻转相等,则基于首先插入的文档。我尝试使用aggregation和$group来为每个userId保留一个唯一的记录,但不知道如何添加条件。这是可能的,如果是的,我可以在此分页吗?

06odsfpq

06odsfpq1#

const result = await YourModel.aggregate([
  {
    $sort: {
      userId: 1, // Sort by userId in ascending order
      milliseconds: 1, // Sort by milliseconds in ascending order
      flips: 1, // Sort by flips in ascending order
      updatedAt: 1 // Sort by updatedAt in ascending order
    }
  },
  {
    $group: {
      _id: "$userId",
      bestScore: { $first: "$$ROOT" } // Select the first document in each group
    }
  },
  {
    $replaceRoot: { newRoot: "$bestScore" } // Replace the root document with the bestScore document
  }
]);
{
    _id: new ObjectId("64817c0547af9b7e12e6cb7f"),
    userId: new ObjectId("647f8f9037c28e47a23c02c0"),
    flips: 32,
    milliseconds: 14547,
    updatedAt: 2023-06-08T06:57:03.479Z,
    __v: 0
  },
  {
    _id: new ObjectId("648874da4ff7074debb99428"),
    flips: 34,
    milliseconds: 12800,
    updatedAt: 2023-06-08T06:54:03.479Z,
    userId: new ObjectId("647f8f9037c28e47a23c02c2"),
    __v: 0
  },
  {
    _id: new ObjectId("648872f24ff7074debb99427"),
    flips: 14,
    milliseconds: 18800,
    updatedAt: 2023-06-08T06:54:03.479Z,
    userId: new ObjectId("647f8f9037c28e47a23c02c1"),
    __v: 0
  }

在这种情况下,它可以工作,但不完全相同,因为我希望结果基于相同的标准进行排序,因为我还想使用分页。

相关问题