在MongoDB中,如何从每个id中获取最近30个结果并按id对它们进行分组

在MongoDB中,如何从每个id中获取最近30个结果并按id对它们进行分组,mongodb,mongoose,mongodb-query,Mongodb,Mongoose,Mongodb Query,我必须从每个“testId”中提取最近30个文档,并按“testId”对它们进行分组 我尝试了$match和$group聚合,请查找以下代码 [ {"testId": "121", "testDetails": [{"result": "pass", "testName": "test1"},..]}, {"testId": "

我必须从每个“testId”中提取最近30个文档,并按“testId”对它们进行分组

我尝试了
$match
$group
聚合,请查找以下代码

[
{"testId": "121", "testDetails": [{"result": "pass", "testName": "test1"},..]},
{"testId": "122", "testDetails": [{"result": "pass", "testName": "test2"},..]},
{"testId": "123", "testDetails": [{"result": "pass", "testName": "test3"},..]},
]

上面的代码返回了所有“testId”中最近的30个文档,但我不知道如何从每个可用的“testId”中获取30个最近的文档并对它们进行分组。而且,我不应该传递任何特定的“testId”或多个“testId”,我必须从集合中所有可用的“testId”中提取您可以使用
$slice
为每个
testId
获取30个文档

  • 已删除
    $limit
    ,因为它不需要
  • 在最后一个
    $addFields
    中,在
    testDetails
    字段中使用
    $slice
    来获取我们之前已经排序过的前30个元素

[
{"testId": "121", "testDetails": [{"result": "pass", "testName": "test1"},..]},
{"testId": "122", "testDetails": [{"result": "pass", "testName": "test2"},..]},
{"testId": "123", "testDetails": [{"result": "pass", "testName": "test3"},..]},
]
testResults.aggregate([
        {
          $match:
          {
            "testId": { "$exists": true };
          }
        },
        {
          $sort: { _id: -1 },
        },
        {
          $limit: 30
        },
        {
          $group: {
            _id: "$testId",
            testDetails: { $push: {result: "$result", testName: "$testName"} }
          }
        }
      ])
        .exec(function (err, testResults) {
          if (err)
            res.send(err);
    
          res.json(testResults);
        });
testResults.aggregate([
  { $match: { testId: { "$exists": true } } },
  { $sort: { _id: -1 } },
  {
    $group: {
      _id: "$testId",
      testDetails: {
        $push: {
          result: "$result",
          testName: "$testName"
        }
      }
    }
  },
  {
    $addFields: {
      testDetails: { $slice: ["$testDetails", 30] }
    }
  }
])
.exec(function (err, testResults) {
  if (err) res.send(err);
  res.json(testResults);
});