我想从给定Messages集合和Room(即对话)的userA中获取所有消息,但是找不到类似于sql的方法
在sql中,逻辑很简单:只需找到其中包含userA的任何房间,然后找到属于上述roomId的所有消息。我尝试了此查询,但它不起作用。我也尝试了$ lookup但失败了
db.getCollection("message").find(
{
"roomId" :{
"$in" : db.getCollection("room").find(
{
"usernames" : "userA",
"msgs" : {
"$gt" : 20.0
}
},
{
"_id" : 1
}
)
}
},
{
"msg" : 1,
"u" : 1,
"roomId" : 1,
"ts" : 1
}
).sort( { "ts" : 1 } );
答案 0 :(得分:1)
以下查询可以为您提供预期的输出:
db.messages.aggreagte([
{
$lookup:{
"from":"room",
"let":{
"roomId":"$roomId"
},
"pipeline":[
{
$match:{
"usernames": "userA",
"msgs":{
$gt: 20
},
$expr:{
$eq:["$_id","$$roomId"]
}
}
},
{
$limit:1
},
{
$project:{
"_id":0,
"found": true
}
}
],
"as":"roomLookup"
}
},
{
$unwind: "$roomLookup"
},
{
$project:{
"msg" : 1,
"u" : 1,
"roomId" : 1,
"ts" : 1
}
},
{
$sort:{
"ts": 1
}
}
]).pretty()
注意:我们限制了查找中的输出,因为我们不需要那里的任何内容。此外,展开阶段只有在查找成功后才能通过。