我在我的项目中使用Node.js和MongoDB(Mongoose.js)。我有一些消息传递系统。存储消息的集合具有下一个模式:
{
message: "Some message text",
user: "54835b0c3d36170c0c6da7f5",
read: 0
}
user
- 此消息所针对的用户的ID。 read
字段有两个可能的值:0
- 用户尚未阅读邮件,1
- 已阅读邮件。
问题是获取有5条或更多未读邮件的用户ID列表。最明显的解决方案是获取所有未读消息的列表,迭代它并基于它构建用户列表。但这看起来不是最佳解决方案(在性能方面)。
我认为应该有更好的方法来完成这项工作。可能通过使用聚合框架。
我希望得到任何帮助:)
答案 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
添加到未读邮件中。
然后您只需$match
新unread_messages
大于或等于5
的文档。