我遇到了一些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]}}
]
}
)
如何在不改变数据结构的情况下实现这一目标?
答案 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"]
}
}