我有一个像这样的对象
==================records=========={ Id: 5114a3c21203e0d811000088,
userId: 'test',
sUserId: test,
userName: 'test',
url: 'test',
Title: 'test'
}
我需要在上面的记录中添加一个新字段名称:'test',我尝试给出records.Name = name,它不起作用。
请帮助
谢谢, 普拉斯
答案 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