查询未读消息

时间:2016-07-30 19:09:12

标签: mongodb

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

{
  participants: [
    'u1,'u2'
  ]
  messages: [
   {text: 'some message', readBy: ['u1','u2']}
   {text: 'some other message', readBy: ['u1']}
  ]
}

' u2' 我想获得查询返回的这个特定线程。这是我已经走了多远,但只要一条消息被' u2' 读取,就不再返回,因为已经读取了其中一条消息' U2'

Threads.find(
        {
            $and: [
                {'participants': this.userId},
                {'messages.readBy': {$nin: [this.userId]}}        
            ]
        }            
    )

如何在不改变数据结构的情况下实现这一目标?

1 个答案:

答案 0 :(得分:1)

您可以使用aggregation执行$unwind操作,该操作将转换Json对象中的messages数组,这将帮助您准确请求所需的项目。

以下查询将为您提供记录,其中" u2"仅参与" u2" :

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