您可以通过聚合框架进行查询。您的查询将涉及pipeline,它具有处理输入文档的阶段,以便为您提供所需的结果。在您的情况下,管道将有一个 $match 阶段,它充当初始过滤器的查询。 $match 使用标准 MongoDB 查询,因此您仍然可以使用 $in 进行查询。
下一步是按createdAt 字段对过滤后的文档进行排序。这是使用 $sort 运算符完成的。
前面的管道阶段涉及聚合有序文档以返回每个组的顶部文档。 $group 运算符和 $first 累加器是使这成为可能的运算符。
综上所述,您可以运行以下聚合操作来获得所需的结果:
memberTags = [1,2,3,4,5];
ClanMember.aggregate([
{ "$match": { "tag": { "$in": memberTags } } },
{ "$sort": { "tag": 1, "createdAt: -1 " } },
{
"$group": {
"_id": "$tag",
"createdAt": { "$first": "$createdAt" } /*,
include other necessary fields as appropriate
using the $first operator e.g.
"otherField1": { "$first": "$otherField1" },
"otherField2": { "$first": "$otherField2" },
...
*/
}
}
]).exec(function(err, members) {
res.json(members);
});
或者使用find() 调整您当前的查询,以便您可以对两个字段进行排序,即tag(升序)和createdAt(降序)属性。然后,您可以使用 limit 选择前 5 个文档,如下所示:
memberTags = [1,2,3,4,5];
ClanMember.find(
{ 'tag': { $in: memberTags } }, // query
{}, // projection
{ // options
sort: { 'createdAt': -1, 'tag': 1 },
limit: memberTags.length,
skip: 0
}
).lean().exec(function(err, members) {
res.json(members);
});
或
memberTags = [1,2,3,4,5];
ClanMember.find({
'tag': {
$in: memberTags
}
}).sort('-createdAt tag')
.limit(memberTags.length)
.lean()
.exec(function(err, members) {
res.json(members);
});