【问题标题】:MongoDB / Mongoose find number of results before youMongoDB / Mongoose 在您之前查找结果数量
【发布时间】:2016-09-21 21:39:41
【问题描述】:

假设我有一个名为“points”的猫鼬模型。我用列名“points”订购它。并通过将我的用户 ID 传递给文档列名称用户 ID 来查找我的文档。

我怎样才能找到某些信息,例如“有 xx 人比你优秀?”

在这种情况下,有多少文件的分数比你高?

需要“循环”多少次搜索才能找到与您的文档匹配的内容?

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

    查询用户的积分,然后查询积分高于此的用户数。

    Points.findOne({userId: userId}, (err, doc) => {
        Points.count({points: {$gt: doc.points}}, (err, count) => {
            // do something with count...
        });
    });
    

    为了可扩展的性能,您需要分别索引 userIdpoints。在您的架构中:

    userId: {type: ObjectId, index: true},
    points: {type: Number, index: true},
    ...
    

    这应该比任何 map-reduce 解决方案都要快。

    【讨论】:

    • 您可能应该通过运行类似db.points.createIndex({points: 1}) 的命令来确保您的集合在points 属性上被索引,以避免count 在较大的集合中运行缓慢
    • @Gaafar 是的,与userId 相同。我会添加该信息,谢谢。
    【解决方案2】:

    这个问题已经在另一个答案中解决了 https://stackoverflow.com/a/22902445/6386175

    您可以将mapReduce 用于小型数据集或更好,维护一个单独的有序集合。

    如果你想使用 mongoose,Model 对象也有 Model.mapReduce 方法,语法相同。

    【讨论】:

    • 你能给我看看 mapreduce 还是维护一个单独的有序的!
    • 在我链接的示例中,您可以看到问题的详细解决方案。把“score”换成“points”……就可以得到用户在排名中的当前位置。
    • 是的。我刚刚用 Model.mapReduce 的 mongoose api 参考更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2021-07-22
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多