【问题标题】:Is data returned from Mongoose immutable?Mongoose 返回的数据是不可变的吗?
【发布时间】:2016-10-27 16:05:59
【问题描述】:

我想从 mongoose 查询中添加返回数据:

User.findById(userId, function(err, data) {
  if (!err) {
    data.newvar = 'Hello, world';
  }
});

但是,当我通过控制台记录输出时,newvar 不存在。我也尝试过使用下划线的扩展:

_.extend(data, {'newvar': 'Hello, world'});

也没有运气。因为我有嵌套文档,所以使用浅拷贝是行不通的。有没有办法在这里追加数据?

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    处理此问题的一种方法是将您的 mongoose 模型实例转换为一个普通对象,您可以通过调用 toObject() 对其进行完全控制:

    User.findById(userId, function(err, data) {
      if (!err) {
        data = data.toObject();
        data.newvar = 'Hello, world';
      }
    });
    

    如果您想要更结构化的解决方案,您可以按照here 的描述将虚拟属性添加到您的架构中。

    【讨论】:

    • 谢谢。我将用户记录从 mongoose 直接传递到 JWT,因此没有应用“过期”字段。没有警告或任何东西。
    【解决方案2】:

    事实证明,Mongoose 文档是它们自己的特殊类,而不是标准的 Javascript 对象。为了得到一个可以扩展的javascript选项,你必须使用toObject()方法。

    【讨论】:

    • 只有我一个人认为在您尝试设置值时应该发出警告吗?
    • .toObject() 方法正是我所需要的!
    【解决方案3】:

    现在你可以使用lea() 方法返回一个普通的js对象:

    User.findById(userId)
      .lean()
      .exec( function(err, data) {
        if (!err) {
          data.newvar = 'Hello, world';
        }
      });
    

    Why can't you modify the data returned by a Mongoose Query (ex: findById)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-22
      • 2019-02-10
      • 2018-11-19
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      相关资源
      最近更新 更多