2011-12-01 92 views
1

我正在使用插件node-mongodb-native與MongoDB和Node.js一起體驗。我遇到的一個問題是嵌套回調的數量。我試圖通過減少查詢所需的代碼來簡化一些事情。構建集合緩存是否是一個好習慣?

取而代之的是...

db.collection("test", function(err, collection) { 
    collection.find(...).toArray(function(err, results) { 
     // ... 
    }); 
}); 

...我想建立它作爲收藏品的高速緩存,從而第一回調是沒有必要的對象。我使用下面的代碼爲建設目標:

var collections = {}; 

["test", "foo"].forEach(function(name) { 
    db.collection(name, function(err, coll) { 
     collections[name] = coll; 
    }); 
}); 

有了它,我可以清理第一代碼片段:

collections.test.find(...).toArray(function(err, results) { 
    // ... 
}); 

我想知道這是否是一個好實踐。它工作得很好,但我認爲獲得集合的回調是有原因的。像我現在所做的那樣構建集合緩存是否有意義?

回答

2

這完全取決於集合對象是什麼。 - 它活着嗎? - 它連接到數據庫嗎? - 它是否執行任何內部緩存? - 它反映了新的數據嗎?

不知道這些細節我建議你創建一個懶惰的評估代理。

Mongo.collection("test").find(...).toArray(function(err, results) { 
    // ... 
}); 

的這裏的想法是,你在內部存儲find命令,當你調用指定者你得到的收集和它調用find命令,然後調用指定者。

這意味着你每次都得到一個新的集合,並避免「緩存安全」問題,但仍然有一個很好的API。

+0

集合對象似乎是活的,因爲它反映了由外部應用程序對集合所做的更新。關於結合回調的解決方案很有趣。我會搗鼓它。 – pimvdb

+0

@pimvdb我在[我的代碼中使用了一個類似的技術[couchdb](https://github.com/Raynos/raynos-blog/blob/master/src/data/post.js#L6)。在這裏,我緩存對數據庫的引用,而不是每次我想查詢時都得到它。我知道這個參考是「緩存安全」。只要你的收藏是「緩存安全」,那麼這是一個很好的技術 – Raynos

相關問題