Mongoose:根据另一个集合中的值过滤集合

Posted

技术标签:

【中文标题】Mongoose:根据另一个集合中的值过滤集合【英文标题】:Mongoose: Filter collection based on values in another collection 【发布时间】:2018-12-11 10:10:02 【问题描述】:

考虑包含另一个集合的 ID 数组的文档,我如何使用 mongoose 根据相关集合找到应用过滤器的文档? 我找不到我的错误

  Installation.aggregate(                        
                    [
                          // Stage 1
                          
                                $lookup: 
                                      from: "users",
                                      localField: "_id",
                                      foreignField: "_id",
                                      as: "Users"
                                
                          ,

                          // Stage 2
                          
                                $unwind: 
                                      path: "$Users"
                                
                          ,
                          // Stage 3
                          
                                $match: 
                                      "Users.Email1" : "test@test.com"

                          , 
                          
                                $sort:  _id: -1 
                          ,
                          
                                $limit: 10
                                                      
                    ]
              ,function (err, installations) 

                   console.log(installations); //<<<<< Empty
                    /*
                    Installation.populate( 'Parent', '_id Email1','Company'), function(err,results) 
                          Installation.count(filter).exec(function (err, count) 
                                res.send( success: true, results: installations, total: count );
                          );
                    ;
                    */                                                             
              );

提前致谢 安德烈亚

【问题讨论】:

如果您在问题中添加一些示例数据会更容易回答 在第 3 阶段之前你能得到结果吗? 输入filter、sorting、_count、req.params.page、req.param.count的值? 完成了我的英雄 :-) 能不能在console.log(installations)前加`**console.log(err)**;??? 【参考方案1】:

您可以使用聚合查询来做到这一点:

db.collectionA.aggregate(

    // Pipeline
    [
        // Stage 1
        
            $lookup: 
                from: "collectionB",
                localField: "_id",
                foreignField: "_id",
                as: "collectionBData"
            
        ,

        // Stage 2
        
            $unwind: 
                path : "$collectionBData"
            
        ,

        // Stage 3
        
            $match: 
                "collectionBData.email": "your@email.address"
            
        ,

    ]

);

希望这能解决您的问题。

此外,在 Mongo 中,我们使用命名约定为 collections 而不是 table_id 而不是 id

【讨论】:

非常感谢,但我不知道应该放在哪里?进入架构? 不,这是一个查询。 我应该使用聚合来代替 find 吗? 'COLLECTIONNAME.aggregate()' 就是这样 您可以在聚合查询中添加排序。聚合是替换查找

以上是关于Mongoose:根据另一个集合中的值过滤集合的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoose nodejs 过滤 mongodb 数据库

Mongoose 先填充,然后根据填充的字段进行过滤

Mongoose 先填充,然后根据填充的字段进行过滤

将新字段添加到集合的所有文档中,将文档字段中的值添加到 MongoDB (Mongoose) 中,记录为 300K+

Lambda 表达式 - 根据集合中另一个属性的值设置对象集合中一个属性的值

从同一数据库mongoose,ejs中的另一个集合中获取数据