我有一个像这样的对象
==================records=========={ Id: 5114a3c21203e0d811000088,
userId: 'test',
sUserId: test,
userName: 'test',
url: 'test',
Title: 'test'
}
我需要在上面的记录中添加一个新字段Name : 'test',我尝试给 records.Name = name,它没有用。
请帮忙
谢谢,普拉茨
我假设您正在尝试将属性添加到返回的 Mongoose 文档以在其他地方重用它。Mongoose 返回的文档不是直接的 JSON 对象,您需要将它们转换为对象以向它们添加属性。以下应该有效:
//... record is a mongoose Document
var r = record.toObject();
r.Name = 'test';
console.log("Record ",r);
那些发现这个问题的人,OP 在原始问题下方的评论中提到,这个问题的解决方案是:
records.set('Name', 'test')
这添加了一个新属性,称为Name
具有值test
。
只需使用,
var convertedJSON = JSON.parse(JSON.stringify(mongooseReturnedDocument);
进而,
convertedJSON.newProperty = 'Hello!'
'你好!' 可以是任何东西、数字、对象或 JSON 对象文字。
干杯! :)
我遇到了类似的问题,并希望我数小时的存在挫败感能帮助处于同样情况的其他人。我倾向于相信通过 Mongoose 返回的文件是只读的。这实际上是不正确的。
但是,您不能将不在架构中的属性分配给文档。
因此,除非您的架构具有以下内容:
{
Name: {String}
}
尝试将 Name 分配给您的文档时,您会经常感到沮丧。
现在,上面的答案中有一些对我有用的解决方法,但它们并没有解决问题的根源:
myDocument.toObject();
JSON.parse(JSON.stringify(myDocument);
这些会起作用,但在我看来,它们只是隐藏了问题。真正的问题是 Mongoose 比我们意识到的更聪明,并且正在强制执行您的模式,因为它应该。
您也可以使用lea()方法,例如const users = await Users.find().lean().exec()
从猫鼬文档中:
从启用了精简选项的查询返回的文档是纯 javascript 对象,而不是 MongooseDocuments。他们没有应用保存方法、getter/setter 或其他 Mongoose 魔法
我的变种。
如果用您定义的架构{strict:false}
可以简单地添加新属性
recorcd.newProp = 'newvalue';
如果与您一起定义的架构{strict:true}
可以将 Mongoose 对象转换为前面提到的对象或使用命令
record.set('newProp','newValue',{strict:false})
请参阅http://mongoosejs.com/docs/api.html#document_Document-schema
如果您已将此对象加载到records
中,则两者records.Name = "test"
或records['Name'] = "test"
都将起作用。您要么没有正确加载对象,要么正在向其中插入未定义的值。
测试:添加console.log(records.userId)
,这应该将“测试”打印到终端。
同时添加console.log(name)
. 如果你得到ReferenceError: name is not defined
,你显然不能这样做:records.Name = name