在Mongoose结果上设置属性值在Node.js中不起作用

时间:2018-11-28 18:53:48

标签: javascript node.js mongoose

你好,

我正在从findById接收MongoDB对象,我想将该对象中的_idObjectID类型转换为string。 我做错了事,但是我无法终生弄清楚这是什么! 我创建了以下函数:

    student: async (parent, { _id }, context, info) => {
        var student = await Student.findById(_id);
        student._id = student._id.toString();
        return student.toObject();
    },

使用调试器,我可以看到所有值均符合预期,并且student._id.toString()正在正确生成字符串。 但是,student对象中的值未设置为生成的字符串。 我尝试添加一个中间变量s,以查看是否有区别,并且没有区别。

我在这里可能做错了什么? 我应该怎么做才能进一步调试?

感谢困惑的C ++开发人员!

2 个答案:

答案 0 :(得分:0)

让我知道我是否在这里很远,但是由于_id周围的花括号,它似乎首先作为对象进入。 如果删除,您可能会得到所需的东西。

除此之外,您可以尝试

student._id = JSON.stringify(student._id);

考虑到它应该从您的MongoDB作为JSON返回

答案 1 :(得分:0)

为什么需要执行_id.toString()?猫鼬document has id,它是_id的字符串表示形式:

student: async (parent, { _id }, context, info) => {
   var student = await Student.findById(_id);
   return { id: student.id, ...student }
},

toObject accepts a transform function,您可以在架构上进行设置,如图所示,这样当调用_id时,您可以使id的行为类似于toObject

也请注意

当您从mongoose获得结果时,会将数据包装model对象中,并且实际文档位于_doc属性下。因此,在执行student._id = student._id.toString()时,您正在装饰model对象,而不是该文档。这就是为什么变换功能更有意义的原因。否则,您必须装饰_doc对象,这真的很难看。