Mongoose按子对象计数

时间:2015-11-05 17:38:30

标签: node.js mongodb count mongoose

我正在尝试根据属性计算集合中的模型数量:

我有一个upvote模型,它有:post(objectId)和一些其他属性。

首先,这是一个好的设计吗?帖子可以获得很多赞成票,所以我不想将它们存储在Post模型中。

无论如何,我想计算具有以下特定属性的帖子上的upvotes数量,但它不起作用。有什么建议吗?

upvote.count({‘post.specialProperty’: mongoose.Types.ObjectId(“id”), function (err, count) {
    console.log(count);
});

1 个答案:

答案 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" }
                }
            }
        ]
)