我正在尝试根据属性计算集合中的模型数量:
我有一个upvote模型,它有:post(objectId)和一些其他属性。
首先,这是一个好的设计吗?帖子可以获得很多赞成票,所以我不想将它们存储在Post模型中。
无论如何,我想计算具有以下特定属性的帖子上的upvotes数量,但它不起作用。有什么建议吗?
upvote.count({‘post.specialProperty’: mongoose.Types.ObjectId(“id”), function (err, count) {
console.log(count);
});
答案 0 :(得分:2)
关于设计。我会设计文档的帖子集合,如下所示:
{
"_id" : ObjectId(),
"proprerty1" : "some value",
"property2" : "some value",
"voteCount" : 1,
"votes": [
{
"voter": ObjectId()// voter Id,
other properties...
}
]
}
您将拥有一个数组,该数组将包含可包含诸如选民ID和其他属性等信息的对象。
更新帖子后,您可以相应地增加或减少voteCount
。你可以像这样增加1
:
db.posts.update(
{"_id" : postId},
{
$inc: { voteCount: 1},
$push : {
"votes" : {"voter":ObjectId, "otherproperty": "some value"}
}
}
)
$inc
修饰符可用于更改现有键的值,或创建新键(如果尚未存在)。它对更新投票非常有用。
如果您希望总计符合特定条件的帖子的金额,则必须使用Aggregation Framework。
你可以得到这样的总数:
db.posts.aggregate(
[
{
$match : {property1: "some value"}
},
{
$group : {
_id : null,
totalNumberOfVotes : {$sum : "$voteCount" }
}
}
]
)