Mongodb 查询未读邮件
我被一些MongoDB查询卡住了。我有一个简单的结构来管理应用程序中的线程和消息Mongodb 查询未读邮件,mongodb,Mongodb,我被一些MongoDB查询卡住了。我有一个简单的结构来管理应用程序中的线程和消息 { participants: [ 'u1,'u2' ] messages: [ {text: 'some message', readBy: ['u1','u2']} {text: 'some other message', readBy: ['u1']} ] } 作为“u2”,我希望得到查询返回的这个特定线程。这就是我已经走了多远,但一旦一条消息被“u2”读取,它就不再返回
{
participants: [
'u1,'u2'
]
messages: [
{text: 'some message', readBy: ['u1','u2']}
{text: 'some other message', readBy: ['u1']}
]
}
作为“u2”,我希望得到查询返回的这个特定线程。这就是我已经走了多远,但一旦一条消息被“u2”读取,它就不再返回,因为其中一条消息已经被“u2”读取
如何在不更改数据结构的情况下实现这一点?您可以使用来执行一个操作,该操作将转换Json对象中的消息数组,这将帮助您准确地请求所需的项
以下查询将为您提供“u2”仅参与“u2”未读取的消息的记录:
这将为您提供:
{
"_id": ObjectId("579d0fc8733ac30906524be4"),
"participants": ["u1", "u2"],
"messages": {
"text": "some other message",
"readBy": ["u1"]
}
}
我必须承认我以前从未使用过聚合。非常感谢你的回答。我要求不要改变我的数据结构,但是否定readBy(即使用unreadBy)就可以在我理解的范围内使用常规查询?您是建议使用聚合还是更改数据结构以便使用常规查询通常更好?这取决于您。如果您使用find
请求,则必须根据您的喜好解析结果,而使用聚合,mongoDB引擎可以为您完成这项工作。聚合将需要更长的时间来执行,但您可以分组、创建字段、项目等。。。考虑到一个聚合,你可以有一个数组,所有的新消息都是未读的,而使用<代码>查找< /COD>你必须迭代结果并自己构建这个数组。你期望的结果是什么?最后,我需要它来计算所有未读线程,即,应选择至少有1条未读消息的任何线程。我将使用此信息在网页上显示徽章,以便用户知道有一些未读消息。来自SQL,我不习惯存储非规范化的东西,所以我最终得到了给定的结构。需要注意的是,我使用的是Meteor,因此并非MongoDB支持的所有功能都是现成的&是被动的。如果您接受的答案有效,那么有更好的方法来实现这一点。
db.threads.aggregate([{
$unwind: "$messages"
}, {
$match: {
"participants": "u2",
"messages.readBy": {
$nin: ["u2"]
}
}
}]);
{
"_id": ObjectId("579d0fc8733ac30906524be4"),
"participants": ["u1", "u2"],
"messages": {
"text": "some other message",
"readBy": ["u1"]
}
}