【发布时间】:2016-09-21 21:39:41
【问题描述】:
假设我有一个名为“points”的猫鼬模型。我用列名“points”订购它。并通过将我的用户 ID 传递给文档列名称用户 ID 来查找我的文档。
我怎样才能找到某些信息,例如“有 xx 人比你优秀?”
在这种情况下,有多少文件的分数比你高?
需要“循环”多少次搜索才能找到与您的文档匹配的内容?
【问题讨论】:
标签: javascript mongodb mongoose
假设我有一个名为“points”的猫鼬模型。我用列名“points”订购它。并通过将我的用户 ID 传递给文档列名称用户 ID 来查找我的文档。
我怎样才能找到某些信息,例如“有 xx 人比你优秀?”
在这种情况下,有多少文件的分数比你高?
需要“循环”多少次搜索才能找到与您的文档匹配的内容?
【问题讨论】:
标签: javascript mongodb mongoose
查询用户的积分,然后查询积分高于此的用户数。
Points.findOne({userId: userId}, (err, doc) => {
Points.count({points: {$gt: doc.points}}, (err, count) => {
// do something with count...
});
});
为了可扩展的性能,您需要分别索引 userId 和 points。在您的架构中:
userId: {type: ObjectId, index: true},
points: {type: Number, index: true},
...
这应该比任何 map-reduce 解决方案都要快。
【讨论】:
db.points.createIndex({points: 1}) 的命令来确保您的集合在points 属性上被索引,以避免count 在较大的集合中运行缓慢
userId 相同。我会添加该信息,谢谢。
这个问题已经在另一个答案中解决了 https://stackoverflow.com/a/22902445/6386175
您可以将mapReduce 用于小型数据集或更好,维护一个单独的有序集合。
如果你想使用 mongoose,Model 对象也有 Model.mapReduce 方法,语法相同。
【讨论】:
Model.mapReduce 的 mongoose api 参考更新了答案。