查询集合A中的文档中具有字段的集合A中的文档

时间:2019-08-06 21:08:28

标签: mongodb

我想从给定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       }    );

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()

注意:我们限制了查找中的输出,因为我们不需要那里的任何内容。此外,展开阶段只有在查找成功后才能通过。