向猫鼬查找查询结果添加字段

Posted

技术标签:

【中文标题】向猫鼬查找查询结果添加字段【英文标题】:Adding a field to mongoose find query result 【发布时间】:2017-09-21 20:21:45 【问题描述】:

我在猫鼬中有这个员工模式:

employeesSchema = mongoose.Schema(
    id: 
        type: Number,
        required: true
    ,
    firstName: String,
    lastName: String,
    title: String,
    managerId: 
        type:Number,
        required: false
    ,
    managerName: 
        type: String,
        required: false
    ,
    phone: String,
    mobilePhone: String,
    email: String,
    picture: String,
);

我有我的功能来寻找员工:

module.exports.getEmployeeById = function(id, callback)

Employee.find( id: id , callback);

但我希望在我的 Schema 的所有字段之外的结果中再添加一个字段,该字段是具有 managerId:id 的员工的数组(该员工下方的员工)。

谢谢

【问题讨论】:

我不认为这提供了足够的细节来值得一个完整的答案,但你正在寻找的是所谓的填充(如连接 SQL):mongoosejs.com/docs/populate.html 我不想填充我的模型或数据库我想在查询 json 响应中添加一个字段 @YassineBHS 假设您不想像提到的那样使用populate,那么一个简单的循环有什么问题? 如果我使用填充,我必须更改我不想要的架构,我希望能够获得这样的 json 响应:employee-directory-services.herokuapp.com/employees/1 【参考方案1】:

您可以使用 $lookup 管道运算符来实现“自我加入”,并让具有此 id 的员工作为他们的经理(在名为 subordinates 的数组中),如下所示:

module.exports.getEmployeeById = function(id, callback)

    Employee.aggregate([
         "$match":  id: id  ,
        
            "$lookup": 
                "from": "employees",
                "localField": "id",
                "foreignField": "managerId",
                "as": "subordinates"
            
        
    ]).exec(callback);


【讨论】:

这对我不起作用,我在 json 响应中得到一个空数组 您是否尝试过仅使用$match 管道来运行它作为调试操作的一种方式?可能是它没有找到匹配项,因此是空数组。如果是这种情况,您还可以通过硬编码现有文档的 id 值来调试管道,或者仅使用 $lookup 步骤运行管道。 当我使用 Employee.find( id: id , callback);它可以工作,但是当我将聚合与 $match 一起使用时(带或不带 $lookup)它不起作用,我得到一个空数组 但是当我像你说的那样将 1 作为 id 传递给它工作的函数时,但是我怎样才能将它传递给变量?? 是的,它有效,谢谢.. 但问题是这个聚合函数返回一个数组,我只想要一个元素而不是数组,因为这就是我在 react native 中读取它的方式。顺便说一句,我会检查你的答案

以上是关于向猫鼬查找查询结果添加字段的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬在查找中排除时返回默认值

修改猫鼬对象文字结果不起作用[重复]

从猫鼬的多个集合中获取数据?

将猫鼬查询结果存储在另一个猫鼬查询中

通过在猫鼬中填充匹配结果来查找文档

从精益查询的结果创建猫鼬模型