Mongodb 查询未读邮件

Mongodb 查询未读邮件,mongodb,Mongodb,我被一些MongoDB查询卡住了。我有一个简单的结构来管理应用程序中的线程和消息 { participants: [ 'u1,'u2' ] messages: [ {text: 'some message', readBy: ['u1','u2']} {text: 'some other message', readBy: ['u1']} ] } 作为“u2”,我希望得到查询返回的这个特定线程。这就是我已经走了多远,但一旦一条消息被“u2”读取,它就不再返回

我被一些MongoDB查询卡住了。我有一个简单的结构来管理应用程序中的线程和消息

{
  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"]
    }
}