2015-08-24 56 views
3

爲了緩解我的MongoDB服務器上的負載,我想緩存Redis中的Waterline中的一些對象。爲了實現這一點,我必須將對象序列化爲JSON。從javascript對象構建水線模型對象

我的問題是,我如何構建我的JSON回到水線模型的一個實例,數據類型處理,成員函數等,使這個消費代碼透明?

我也希望這個時候我運行本地的MongoDB的查詢,讓我與當地的ObjectID對象,不匹配的日期類型等

User.findOne(id, function (err, user) { 
    // to string and back again, could be stored in cache in the meantime 
    var object = JSON.parse(JSON.stringify(user)); 

    var user = new User(object); //doesn't work 
    var user = User.toObject(object); // doesn't work 
} 

回答

1

你想辦法什麼樣的cache

var object = JSON.parse(JSON.stringify(user));不會存儲所有的信息。 JSON與JavaScript對象不同。其中user是JavaScript對象,由Sails的Waterline引擎創建。它有像save這樣的方法,但是當你把它變成JSON的時候,這個方法將會消失。

無論var user = new User(object);var user = User.toObject(object);將無法​​正常工作,因爲User不是構造函數,它只是一個速記sails.models.user代表在/api/models/User.jsUser模型。

如果您想快速查詢,您必須將您的data存儲在您的Redis中,稍後再從中檢索。

這意味着,您應該將主數據庫中的user保存到redis中,方法是手動將其插入到redis中,然後再檢索它。但是,除了將主數據庫模型(本例中爲User)複製到redis User模型(或任何您命名的模型)之外,所有主數據庫模型特徵都將消失。

+0

只是爲了說明的目的放置JSON往返。在真實的項目中,序列化和反序列化將按時間偏移,字符串將存儲在Redis或內存中。 – stensrud

5

根據this issue,這應該工作有關您插入值

var user = new User._model(object); 

留意。新的對象應該真正適合你在串化之前所擁有的東西。

+0

太好了。我會檢查這是否有效。整個下劃線的東西看起來有點不穩定,但如果我封裝它並編寫一些迴歸測試,我可以在生產中使用它。 – stensrud

+0

非常感謝 –