使用Meteor

时间:2017-03-12 23:22:20

标签: javascript mongodb meteor ecmascript-6

我在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中的标准做法是以这种方式存储对象,还是有一些方法可以在保存之前方便地从对象中剥离方法,以便只存储数据和更新的属性?

1 个答案:

答案 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);