首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB/MongoDB:$in和.sort()

MongoDB/MongoDB:$in和.sort()
EN

Stack Overflow用户
提问于 2017-01-04 14:53:10
回答 2查看 560关注 0票数 2

我每天在游戏中点击一个API,跟踪50个成员的数据,并使用mongoose将JSON转换为集合中的单个文档。白天之间有一致的数据,例如每个成员的标签(游戏中成员的id ),但是有不同的数据(不同的分数等等)。每个文档都有一个createdAt属性。

我想为每个成员找到最新的文档,因此有一个带有每个成员标记的数组。

我目前正在使用下面的查询查找标记匹配的所有文档,但是它们返回的是所有文档,而不仅仅是一个文档。如何将文档排序/限制为最近的文档,同时将其保留为一个查询(或者是否有更多的"mongodb方式“)?

代码语言:javascript
复制
memberTags = [1,2,3,4,5];
ClanMember.find({
    'tag': {
        $in: memberTags
    }
}).lean().exec(function(err, members) {
    res.json(members);
});

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-04 15:17:53

您可以通过聚合框架进行查询。您的查询将涉及一个管道,它具有处理输入文档以给出所需结果的阶段。在您的例子中,管道将有一个$match阶段,它充当初始过滤器的查询。$match使用标准MongoDB查询,因此仍然可以使用$in进行查询。

下一步是按照createdAt字段对那些过滤过的文档进行排序。这是使用$sort运算符完成的。

前面的管道阶段涉及聚合已排序的文档以返回每个组的顶级文档。$group运算符和$first累加器是使这成为可能的运算符。

总之,您可以运行以下聚合操作以获得所需的结果:

代码语言:javascript
复制
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种文档,如下所示:

代码语言:javascript
复制
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);
});

代码语言:javascript
复制
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);
});
票数 2
EN

Stack Overflow用户

发布于 2017-01-04 15:08:18

好的,那么,首先,让我们使用findOne(),以便从请求中只获得一个文档,然后根据最新文档进行排序,您可以使用.sort({elementYouWantToSort: -1}) (-1意味着您希望从最新文档到最旧文档排序,从最旧文档到最新文档排序),我建议在_id上使用这个函数,其中已经包括了文档的创建日期,这给了我们以下请求:

代码语言:javascript
复制
ClanMember.findOne({
    'tag': {
        $in: memberTags
    }
}).sort({_id: -1}).lean().exec(function(err, members) {
    res.json(members);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41466747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档