Node.jsでMongo/Mongooseを使用してデータをキャッシュしています。Cacheオブジェクトには、多数のCachedPagesが含まれています。言い換えると:
var PageSchema = {
'source': String,
'data': {}
};
var PageModel = mongoose.model('pages',PageSchema);
var CacheSchema = {
'last_updated': Date,
'pages': [PageSchema]
}
var CacheModel = mongoose.model('caches',CacheSchema);
新しいページデータの配列が入ってくると、最初に新しいオブジェクトごとに新しいCachedPageを挿入してキャッシュします。
var data = new PageModel({'source': page.source, 'data': page.contents});
data.save(function(err){
// error handling removed
pages.push(data);
});
最後に、ページを新しいキャッシュに保存します。
var cache = new CacheModel({'last_updated': new Date(), 'pages': pages});
cache.save(...);
ここまでは順調ですね!すべてが適切に保存されます。
ページを更新したいときに問題が発生します。アップサートを実行してPageModelを変更しても、CacheModel内のページのデータには影響しないようです。たとえば、私がそうする場合:
PageModel.update({'_id': id_to_update}, {'data': new_data}, {'upsert': true}, function(...));
次に、ページが更新されても、キャッシュを取得するために「検索」を実行すると、ページの配列には古いデータが反映されたままになります。
CacheSchemaの宣言の一部としてPageSchemaを使用する利点は、ページへの更新がキャッシュ内に反映されるように、オブジェクトがリンクされることであると理解していました。私は何が欠けていますか?
明らかに、CacheSchema.pagesを_idsの配列に変更できます。次に、キャッシュを取得する場合は、PageModelで2番目のクエリを実行して、_idsの配列をオブジェクトの配列に変換します。これで問題は解決しますが、2番目のクエリが追加されます...
ありがとう!