28

我有一个像这样的对象

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

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

请帮忙

谢谢,普拉茨

4

7 回答 7

54

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

//... record is a mongoose Document
var r = record.toObject();
r.Name = 'test';
console.log("Record ",r);
于 2013-05-04T18:39:24.660 回答
13

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

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

这添加了一个新属性,称为Name具有值test

于 2013-12-11T20:29:11.720 回答
10

只需使用,

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

进而,

convertedJSON.newProperty = 'Hello!' 

'你好!' 可以是任何东西、数字、对象或 JSON 对象文字。

干杯! :)

于 2015-03-18T20:16:46.727 回答
6

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

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

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

{
    Name: {String}
}

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

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

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

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

于 2016-06-08T22:31:16.640 回答
3

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

从猫鼬文档中:

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

于 2018-04-13T03:06:46.077 回答
3

我的变种。

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

recorcd.newProp = 'newvalue';

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

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

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

于 2018-06-29T07:51:58.310 回答
-1

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

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

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

于 2013-02-08T08:10:20.780 回答