我在Meteor项目中有一个这样的JS对象(ES6):
export class MyClass {
constructor() {
this.data: uuid.v4(),
this.updated: new Date(),
}
action() {
this.updated = new Date();
}
}
我将它保存到MongoDB集合中,如下所示:
let id = myDB.insert(new myClass());
稍后,我通过Id获取对象:
let persisted = myDB.findOne({ _id: id });
如果我运行以下命令,它将工作并更新对象的更新属性:
persisted.action();
现在,这很方便,我很想和它一起运行,但它似乎将动作方法的逻辑存储到MongoDB中。这似乎效率低下,因为我将使用相同的action()方法保存许多MyClass实例。
Meteor中的标准做法是以这种方式存储对象,还是有一些方法可以在保存之前方便地从对象中剥离方法,以便只存储数据和更新的属性?
答案 0 :(得分:0)
您可以考虑在类中添加一个返回对象JSON版本的方法。然后,您应该将此JSON版本插入MongoDB。此外,您应该将构造函数更改为接受参数,这在从数据库中提取对象时非常有用。
将此构造函数添加到MyClass:
constructor(data, updated) {
this.data = data;
this.updated = updated;
}
将以下方法添加到MyClass
:
toJSON() {
return {
data: this.data,
updated: this.updated
}
}
实例化课程:
let myObject = new myClass(uuid.v4(), new Date());
然后,在JSON.stringify
上致电myObject
:
let myObjectJSON = JSON.stringify(myObject)
最后,在MongoDB集合中插入myObjectJSON
:
let id = myDB.insert(myObjectJSON);
每次从具有JSON.stringify
方法的类调用对象实例上的toJSON
时,都会调用此方法。
从集合中获取此文档时,从MyClass创建一个新的实例,将构造函数的参数作为参数传递给文档中的字段。
let persisted = myDB.findOne({ _id: id });
let persistedObject = new myClass(persisted.data, persisted.updated);