【问题标题】:How can I mix a populated ObjectId with a string如何将填充的 ObjectId 与字符串混合
【发布时间】:2021-04-17 05:51:26
【问题描述】:

实际上,在数据库中我得到了一个我用 GET 路由请求的工作:

所以当我填充候选人时,我得到了这种响应格式:

我的问题是我不需要那个“id”对象,我只需要一个包含用户作为对象的“selected_candidates”数组。实际上它是一个对象,在另一个数组中的对象中。

这是来自我的控制器的代码(填充在 jobsService 中):


如果我这样更改作业的数据格式:

...它工作得很好(使用路径:“candidates_selected”),就像预期的那样但是我没有那个“状态”字符串(正常,因为我在数据库中没有它了。因为 ObjectId) :

我想要一个同时拥有它们的解决方案,但也许这是 noSQL 的限制?


没有填充但有循环的解决方案(我认为这不是一个好主意):

【问题讨论】:

    标签: node.js mongodb mongoose nestjs


    【解决方案1】:

    我认为没有方便的方法来实现它。但是,您可以尝试使用本机 MongoDB 驱动程序的聚合框架。

    让您的 Mongoose 架构为 ASchemaBSchema

    const result = await ASchema.aggregate([
        {$addFields: {org_doc: '$$ROOT'}}, // save original document to retrieve later
        {$unwind: '$candidates_selected'},
        {
            $lookup: {
                from: BSchema.collection.name,
                let: {
                    selected_id: '$candidates_selected.id',
                    status: '$candidates_selected.status',
                },
                pipeline: [
                    {
                        $match: {$expr: {$eq: ['$$selected_id', '$_id']}}, // find candidate by id
                    },
                    {
                        $addFields: {status: '$$status'} // attach status
                    }
                ],
                as: 'found_candidate'
            }
        },
        {
            $group: { // regroup the very first $unwind stage
                _id: '$_id',
                org_doc: {$first: '$org_doc'},
                found_candidates: {
                    $push: {$arrayElemAt: ['$found_candidate', 0]} // result of $lookup is an array, concat them to reform the original array
                }
            }
        },
        {
            $addFields: {'org_doc.candidates_selected': '$found_candidates'} // attach found_candidates to the saved original document
        },
        {
            $replaceRoot: {newRoot: '$org_doc'} // recover the original document
        }
    ])
    

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 2012-04-21
      • 1970-01-01
      相关资源
      最近更新 更多