Mongodb聚合$lookup $project和$match不起作用[重复]

Posted

技术标签:

【中文标题】Mongodb聚合$lookup $project和$match不起作用[重复]【英文标题】:Mongodb aggregate $lookup $project and $match do not work [duplicate] 【发布时间】:2020-08-07 13:59:39 【问题描述】:

我需要你的帮助。我在我的两个集合上使用过滤器练习非常简单的连接方法。它可以在没有过滤器的情况下工作。 下面提到了我的 mongodb 查询。

两个合集

第一次收藏


    "_id": ObjectId("5ea18cd00715f152a6fcee24"),
    "company_name": "COMPANY 1",
    "company_detail_id": [
            
                "_id": ObjectId("5e5db61dbb9d1523f7d78e65") //NOTE: company_detail_id == programs._id
            
    ],
    "is_deleted": false,

第二次收藏


     "_id": ObjectId("5e5db61dbb9d1523f7d78e65"),
     "name": "PROGRAM 1",
     "is_deleted": false

查询

var list = await dataModel.aggregate([
            
                $lookup: 
                    from: "company_details",
                    localField: "company_detail_id._id",
                    foreignField: "_id",
                    as: "programs"
                
            ,
            
                "$project": 
                            "_id": true,
                            "company_name": true,
                            "company_detail_id": true,
                            "is_deleted": true,
                            "programs._id": true,
                            "programs.name": true,
                            "programs.is_deleted": true
                        
            ,
            
                "$match": 
                            "_id": "5ea18cd00715f152a6fcee24",
                            "is_deleted":false
                            
            
        ]).skip(0).limit(10);

问题

这个查询在什么时候起作用

    "$match" :  
    or
    "$match" :  "company_name": "xyz"  

这个查询不工作什么时候

    "$match" :  "_id" : "5ea18cd00715f152a6fcee24"  
    or
    "$match" :  "_id": "5ea18cd00715f152a6fcee24", "is_deleted":false  

预期结果


    "_id": "5ea18cd00715f152a6fcee24",
    "company_name": "COMPANY 1",
    "company_detail_id": [
            
                "_id": "5e5db61dbb9d1523f7d78e65" //NOTE: company_detail_id == programs._id
            
    ],
    "is_deleted": false,
    "programs": [
            
                 "_id": "5e5db61dbb9d1523f7d78e65",
                 "name": "PROGRAM 1",
                 "is_deleted": false
            
    ]

【问题讨论】:

【参考方案1】:

"_id" : "5ea18cd00715f152a6fcee24" 为部分的$match 阶段不起作用,因为它试图将ObjectId 与字符串匹配。

由于这里使用了 Mongoose,因此使用 mongoose.Types.ObjectId('5ea18cd00715f152a6fcee24') 将该字符串转换为有效的 mongodb ObjectId

查询:

var mongoose = require("mongoose");
var list = await dataModel
  .aggregate([
    
      $lookup: 
        from: "company_details",
        localField: "company_detail_id._id",
        foreignField: "_id",
        as: "programs",
      ,
    ,
    
      $project: 
        _id: true,
        company_name: true,
        company_detail_id: true,
        is_deleted: true,
        "programs._id": true,
        "programs.name": true,
        "programs.is_deleted": true,
      ,
    ,
    
      $match: 
        _id: mongoose.Types.ObjectId("5ea18cd00715f152a6fcee24"),
        is_deleted: false,
      ,
    ,
  ])
  .skip(0)
  .limit(10);

Playground Link

【讨论】:

是的,您在我编辑查询时发布了解决方案:)。还有一个建议:您没有使用单独的包mongodb 将字符串转换为objectId。猫鼬就足够了。【参考方案2】:

我找到了解决方案

我包括

const ObjectId = require('mongodb');

然后在 $match 我使用

"$match" :  "_id" : ObjectId("5ea18cd00715f152a6fcee24") 

【讨论】:

以上是关于Mongodb聚合$lookup $project和$match不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb 聚合管道限制 $lookup 字段

MongoDB 聚合中的多个 $project 阶段是不是会影响性能

MongoDb:聚合 $lookup

MongoDB 聚合 - $lookup 性能

Mongodb 聚合 $lookup 和 group 非常非常慢

mongodb聚合操作汇总