将新属性添加到node.js中的现有json对象

时间:2013-02-08 08:02:01

标签: node.js mongodb mongoose

我有一个像这样的对象

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

我需要在上面的记录中添加一个新字段名称:'test',我尝试给出records.Name = name,它不起作用。

请帮助

谢谢, 普拉斯

7 个答案:

答案 0 :(得分:46)

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

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

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:8)

只需使用,

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

然后,

convertedJSON.newProperty = 'Hello!' 

'你好!'可以是任何东西,数字,对象或JSON Object Literal。

干杯! :)

答案 3 :(得分:4)

我遇到了类似的问题,并希望我的生存挫折时间可以在同样的情况下帮助其他人。我倾向于相信通过Mongoose返回的文件是只读的。事实并非如此。

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

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

{
    Name: {String}
}

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

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

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

这些可行,但在我看来,他们只是隐藏了问题。真正的问题是,Mongoose比我们意识到的更聪明,并且正在执行你的架构。

答案 4 :(得分:3)

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

来自mongoose文档:

  

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

答案 5 :(得分:1)

我的变体。

如果使用{strict:false}定义的架构,则只需添加新属性,即可

recorcd.newProp = 'newvalue';

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

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

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

答案 6 :(得分:-1)

如果您已将此对象加载到records,则records.Name = "test"records['Name'] = "test"都可以使用。您没有正确加载对象,或者正在向其中插入未定义的值。

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

同时添加console.log(name)。如果您获得ReferenceError: name is not defined,则显然无法做到:records.Name = name