【问题标题】:Add a new attribute to existing json object in node.js向 node.js 中的现有 json 对象添加新属性
【发布时间】:2013-01-23 22:58:01
【问题描述】:

我有一个这样的对象

==================records=========={ Id: 5114a3c21203e0d811000088,
  userId: 'test',
  sUserId: test,
  userName: 'test',
  url: 'test',
  Title: 'test'
}

我需要在上面的记录中添加一个新字段Name : 'test',我尝试给records.Name = name,它没有工作。

请帮忙

谢谢, 小伙伴们

【问题讨论】:

  • 这条记录是否来自一个数据库,比如 mongodb,使用 mongoose?
  • @balaz:是的,它来自猫鼬,records.set('Name', 'test') 为我工作
  • 什么时候检查这个数据库记录的值?保存到数据库后?我问这个,因为如果你想要的字段不在模式中,猫鼬不会将它保存到数据库中,你应该将它添加到模式中,或者调用markModified。请按照@neelsg 的建议提供更多代码。

标签: node.js mongodb mongoose


【解决方案1】:

我的变种。

如果架构使用{strict:false} 定义,您可以简单地添加新属性

recorcd.newProp = 'newvalue';

如果架构使用{strict:true} 定义,您可以将 Mongoose 对象转换为前面提到的对象或使用命令

record.set('newProp','newValue',{strict:false})

http://mongoosejs.com/docs/api.html#document_Document-schema

【讨论】:

    【解决方案2】:

    您也可以使用lean() 方法,例如const users = await Users.find().lean().exec()

    来自猫鼬文档:

    启用了精简选项的查询返回的文档是普通的 javascript 对象,而不是 MongooseDocuments。他们没有保存方法, 应用了 getter/setter 或其他 Mongoose 魔法

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,并希望我数小时的存在挫败感能帮助遇到同样情况的其他人。我倾向于相信通过 Mongoose 返回的文件是只读的。这实际上是不正确的。

      但是,您不能将不在架构中的属性分配给文档。

      所以,除非您的架构具有以下内容:

      {
          Name: {String}
      }
      

      尝试将名称分配给您的文档时,您会经常感到沮丧。

      现在,上面的答案中有一些对我也有用的解决方法,但它们没有找到问题的根源:

      myDocument.toObject();
      JSON.parse(JSON.stringify(myDocument);
      

      这些会起作用,但在我看来,它们只是隐藏了问题。真正的问题是 Mongoose 比我们意识到的更聪明,并且正在强制执行您的架构,因为它应该这样做。

      【讨论】:

      • 小心!...你会丢失数字等。
      • JSON.parse(JSON.stringify(myDocument); 这会导致性能问题。使用myDocument.toObject()
      • @Maxwells.c,你能澄清你的评论吗?我不推荐其中任何一种方法(实际上是上述答案推荐的方法),但说它们在技术上会起作用。我的建议是坚持你的模式。
      • @misterfancypants 使用 JSON 克隆对象没有很好的性能,因为它会处理对对象进行字符串化,然后解析字符串以创建另一个对象。在具有大量数据的大型项目中,这可能会降低应用程序的速度。 mongoose 文档的 toObject 方法移除了所有的 mongoose 类和方法,得到一个纯 JS 对象。这也不完美,因为它需要处理。如果您不想要猫鼬文档,最好的解决方案是将参数传递给查询(我不记得标签),它将返回一个纯对象数组。
      【解决方案4】:

      随便用,

      var convertedJSON = JSON.parse(JSON.stringify(mongooseReturnedDocument);
      

      然后,

      convertedJSON.newProperty = 'Hello!' 
      

      “你好!”可以是任何东西、数字、对象或 JSON 对象字面量。

      干杯! :)

      【讨论】:

        【解决方案5】:

        那些发现这个问题的人,OP在原始问题下面的评论中提到这个问题的解决方案是:

        records.set('Name', 'test')
        

        这会添加一个名为Name 的新属性,其值为test

        【讨论】:

        • 如何将新属性添加到存储在 mysql 表列中的 json 对象中?现在` "1":{"lastname":"blah","firstname":"RA","function":"General Manager","email":"test@hotmail.com","barcode":"33432799181 "} ` 我喜欢"1":{"lastname":"blah","firstname":"R.A.","function":"General Manager","email":"test@hotmail.com","barcode":"33432799181", "visited":"0"}
        【解决方案6】:

        我假设您正在尝试将属性添加到返回的 Mongoose 文档中以在其他地方重用它。 Mongoose 返回的文档不是直接的 JSON 对象,您需要将它们转换为对象以向它们添加属性。以下应该有效:

        //... record is a mongoose Document
        var r = record.toObject();
        r.Name = 'test';
        console.log("Record ",r);
        

        【讨论】:

        【解决方案7】:

        如果您已将此对象加载到 recordsrecords.Name = "test"records['Name'] = "test" 都将起作用。您要么没有正确加载对象,要么正在向其中插入未定义的值。

        测试:添加console.log(records.userId),这应该将'test'打印到终端。

        同时添加console.log(name)。如果你得到ReferenceError: name is not defined,你显然不能这样做:records.Name = name

        【讨论】:

        • 感谢您的回复,我看到 console.log(records.Name) 正确记录了值,但 console.log(util.inspect(records)) 没有“名称”字段,知道为什么吗?
        • @Prats:试试console.log(util.inspect(records, 1))。如果它仍然给出相同的结果,我将不得不查看您的整个脚本以了解问题所在。
        猜你喜欢
        • 1970-01-01
        • 2018-07-24
        • 2018-10-23
        • 2017-02-10
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        • 2020-05-02
        • 2016-12-30
        相关资源
        最近更新 更多