【问题标题】: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

标签: node.js mongodb mongoose mongodb-query aggregation-framework


【解决方案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 中读取它的方式。顺便说一句,我会检查你的答案
猜你喜欢
  • 2019-12-12
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2017-05-08
  • 2014-07-25
  • 1970-01-01
  • 2019-01-26
  • 2017-12-03
相关资源
最近更新 更多