【问题标题】:Mongodb aggregate $lookup $project and $match do not work [duplicate]Mongodb聚合$lookup $project和$match不起作用[重复]
【发布时间】: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
            }
    ]
}

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案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") }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2015-12-03
      • 2021-04-11
      • 2019-01-29
      • 1970-01-01
      • 2021-12-01
      • 2018-12-20
      相关资源
      最近更新 更多