Mongoose 猫鼬按参考计数器排序

Mongoose 猫鼬按参考计数器排序,mongoose,Mongoose,我有民意测验和投票,我想对排名靠前的民意测验(投票最多的民意测验)进行排序。 这是我的模式: pollSchema = Schema ({ ... }; voteSchema = Schema ({ ... poll: { type: Schema.ObjectId, ref: "Poll" }, user: { type: Schema.ObjectId, ref: "User" } }; 因此,基本上每次投票都指向它所属的投票,而不是相反的方向(保持一个“

我有民意测验和投票,我想对排名靠前的民意测验(投票最多的民意测验)进行排序。 这是我的模式:

pollSchema = Schema ({
    ...
};

voteSchema = Schema ({
    ...
    poll: { type: Schema.ObjectId, ref: "Poll" },
    user: { type: Schema.ObjectId, ref: "User" }
};
因此,基本上每次投票都指向它所属的投票,而不是相反的方向(保持一个“真相来源”)。
(我之所以不将投票引用/保留为子文档,是因为投票也应该引用投票人)

我正在努力寻找一种简单的方法,根据选票指向多少对所有民意测验进行排序(基本上是说,根据投票数对民意测验进行排序)

当然,这是一种艰苦的工作方式(伪代码):

当然,这应该行得通,但我正在寻找一个更好的方法,若有人的话。
有点像猫鼬的新手,所以我可能错过了一些阅读文档的内容。

所以如果我理解正确,您希望返回每个池收到的投票数吗

要实现这一点,您可以使用Mongo聚合,然后将其转换为Moongose

在您的情况下,您的代码如下所示:

Vote.aggregate([
    {$group: {_id: "$poll", "votes": {$sum: 1}}},
    {$sort: {"votes": -1}},
    {$lookup: {from: "polls", localField: "_id", foreignField: "_id", as: "pollObject"}} //from is the name of table in database
])

这将返回您的数组,其中\u id将表示您的投票,选票将表示收到的投票数。数组将按投票数降序排序。请注意,$lookup返回一个数组,因此需要提取它。

Close。有没有办法获取完整的poll对象而不仅仅是它的id?如果没有,这仍然是非常有用的,所以谢谢!如果您使用的是较新版本的Mongo,例如3.2,有一种方法。见更新答案。太棒了!谢谢我怎样才能过滤民意测验呢?我的意思是,就像我经常做的
poll.find({title:'bla'})
,通过管道
find
到您提供的代码应该会起作用吗?不仅仅是管道不会起作用,但是您可以在查找后使用
{$match:{title:'bla}
。这将以与find相同的方式工作。或者,如果您想在填充的字段(例如pollObject)中搜索,那么您可以搜索为
{$match:{“pollObject.0.title”:“bla”}
经过一些测试,我发现这非常有效,但有一种情况除外:如果一个投票根本没有投票,那么查询结果中就会缺少它。我想这是有道理的,因为我在收集选票。有没有办法“修复”这个问题?
Vote.aggregate([
    {$group: {_id: "$poll", "votes": {$sum: 1}}},
    {$sort: {"votes": -1}},
    {$lookup: {from: "polls", localField: "_id", foreignField: "_id", as: "pollObject"}} //from is the name of table in database
])