如何获取MongoDB中至少有N条未准确消息的用户列表?

时间:2015-05-21 13:33:43

标签: mongodb

我在我的项目中使用Node.js和MongoDB(Mongoose.js)。我有一些消息传递系统。存储消息的集合具有下一个模式:

{
  message: "Some message text",
  user: "54835b0c3d36170c0c6da7f5",
  read: 0
}

user - 此消息所针对的用户的ID。 read字段有两个可能的值:0 - 用户尚未阅读邮件,1 - 已阅读邮件。

问题是获取有5条或更多未读邮件的用户ID列表。最明显的解决方案是获取所有未读消息的列表,迭代它并基于它构建用户列表。但这看起来不是最佳解决方案(在性能方面)。

我认为应该有更好的方法来完成这项工作。可能通过使用聚合框架。

我希望得到任何帮助:)

2 个答案:

答案 0 :(得分:3)

您可以使用以下聚合框架:

db.collection.aggregate([
    {
        "$match": { "read": 0 }
    },
    {
        "$group": {
            "_id": "$user",
            "unread_count": { "$sum": 1 }
        }        
    },
    {
        "$match": { 
            "unread_count": { "$gte": 5 }
        }
    }
])

答案 1 :(得分:0)

确切地说,使用聚合框架:)像这样:

db.messages.aggregate([
                         {
                            $group: {
                                       _id: "$user",
                                       unread_messages: {$sum: {$cond: ["$read", 0, 1]}}
                                    },
                         },
                         {
                            $match: {
                                       unread_messages: {$gte: 5}
                                    }
                         }
                      ])

这里的重点是,如果$group字段为1,我们会read每个用户的所有邮件,并将0添加到未读邮件中。

然后您只需$matchunread_messages大于或等于5的文档。