我每天在游戏中点击一个API,跟踪50个成员的数据,并使用mongoose将JSON转换为集合中的单个文档。白天之间有一致的数据,例如每个成员的标签(游戏中成员的id ),但是有不同的数据(不同的分数等等)。每个文档都有一个createdAt属性。
我想为每个成员找到最新的文档,因此有一个带有每个成员标记的数组。
我目前正在使用下面的查询查找标记匹配的所有文档,但是它们返回的是所有文档,而不仅仅是一个文档。如何将文档排序/限制为最近的文档,同时将其保留为一个查询(或者是否有更多的"mongodb方式“)?
memberTags = [1,2,3,4,5];
ClanMember.find({
'tag': {
$in: memberTags
}
}).lean().exec(function(err, members) {
res.json(members);
});谢谢
发布于 2017-01-04 15:17:53
您可以通过聚合框架进行查询。您的查询将涉及一个管道,它具有处理输入文档以给出所需结果的阶段。在您的例子中,管道将有一个$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 (降序)属性。然后,您可以使用极限选择前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);
});发布于 2017-01-04 15:08:18
好的,那么,首先,让我们使用findOne(),以便从请求中只获得一个文档,然后根据最新文档进行排序,您可以使用.sort({elementYouWantToSort: -1}) (-1意味着您希望从最新文档到最旧文档排序,从最旧文档到最新文档排序),我建议在_id上使用这个函数,其中已经包括了文档的创建日期,这给了我们以下请求:
ClanMember.findOne({
'tag': {
$in: memberTags
}
}).sort({_id: -1}).lean().exec(function(err, members) {
res.json(members);
});https://stackoverflow.com/questions/41466747
复制相似问题