繁体   English   中英

使用Meteor将没有其方法的JS对象存储在Mongo中

[英]Store a JS object without its methods in Mongo using Meteor

我在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();

现在,这很方便,我很想使用它,但是它似乎是将action方法的逻辑存储到MongoDB中。 这似乎效率很低,因为我将使用相同的action()方法保存许多MyClass实例。

流星是否以这种方式存储对象是标准做法,还是有某种方法可以在保存对象之前方便地将方法从对象中剥离出来,以便仅存储数据和更新的属性?

您可以考虑向类添加一个方法,该方法返回对象的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());

然后,在myObject上调用JSON.stringify

let myObjectJSON = JSON.stringify(myObject)

最后,将myObjectJSON插入MongoDB集合中:

let id = myDB.insert(myObjectJSON);

每次您从具有名为toJSON方法的类的对象JSON.stringify上调用JSON.stringify时,都会调用此方法。

当您从集合中获取此文档时,请从MyClass创建一个新实例,并将该文档中的字段作为参数传递给构造函数。

let persisted = myDB.findOne({ _id: id });
let persistedObject = new myClass(persisted.data, persisted.updated);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM