【问题标题】:es6 spread operator - mongoose result copyes6 扩展运算符 - 猫鼬结果副本
【发布时间】:2018-06-09 09:59:38
【问题描述】:

我正在使用 mongo DB 和 mongoose 开发一个 express js API。

我想在 Javascript es6 中创建一个由少量变量和猫鼬请求的结果组成的对象,并希望使用 es6 扩展运算符:

MyModel.findOne({_id: id}, (error, result) => {
   if (!error) {
      const newObject = {...result, toto: "toto"};
   }
});

问题在于将扩展运算符应用于 result 以一种奇怪的方式对其进行转换:

newObject: {
   $__: {
      $options: true,
      activePaths: {...},
      emitter: {...},
      getters: {...},
      ...
      _id: "edh5684dezd..."
   }
   $init: true,
   isNew: false,
   toto: "toto",
   _doc: {
      _id: "edh5684dezd...",
      oneFieldOfMyModel: "tata",
      anotherFieldOfMyModel: 42,
      ...
   }
}

我有点理解对象结果由 mongoose 丰富以允许与它进行特定交互,但是当我在执行此操作之前 console.log 时,它描绘了一个没有所有这些东西的简单对象。

我不想通过 ...result._doc 来作弊,因为我抽象了这部分,它不适合这种方式。也许有一种方法可以复制没有丰富内容的对象。

感谢您的宝贵时间。

【问题讨论】:

  • 看看它的toString 方法。这就是您在 console.log 中看到的内容
  • 对结果执行 toString 会返回仅包含我的字段的简单对象,因此看起来该对象是正常的,但是当我尝试使用扩展运算符时,它会更改对象结构。它与Object.assign() 完全相同。
  • 是的,然后console.log( result.toString ) 看看它是如何工作的......

标签: javascript mongoose ecmascript-6


【解决方案1】:

您可以使用 Mongoose Document.toObject() 方法。它将返回从数据库中获取的底层纯 JavaScript 对象。

const newObject = {...result.toObject(), toto: "toto"};

您可以阅读有关.toObject() 方法here 的更多信息。

【讨论】:

  • 好的,就这么简单,这正是我要找的,但没找到:) 谢谢,希望它能帮助更多的人。
  • 感谢您,我进行了跟进,在执行此操作后,我无法使用之前可以用作 result.toJSON() 的 newObject.toJSON()。这里有其他选择吗?
  • 你也可以直接在你的数据库查询上使用.lean,阅读更多here
【解决方案2】:

对某人可能会有所帮助:

const newObject = {
    ...JSON.parse(JSON.stringify(result)),
    toto: "toto"
};

但是如果你使用日期、函数、未定义、 架构中的正则表达式或无穷大

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,除了上一个答案之外,我还找到了一些替代方案。

    选项1Object.assign()

    The Object.assign() method copies all enumerable own properties from one or more source objects to a target object. It returns the modified target object.

    示例:

    Object.assign(result, {toto: "toto");
    
    

    选项 2Document.prototype.set():

    Sets the value of a path, or many paths.

    doc.set("toto", "toto")
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2021-05-21
      • 2016-02-26
      相关资源
      最近更新 更多