我在 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(...);
到目前为止,一切都很好!一切都正确保存。
当我想更新页面时,问题就来了。当我执行 upsert 来修改 PageModel 时,它似乎不会影响 CacheModel 内页面中的数据。例如,如果我这样做:
PageModel.update({'_id': id_to_update}, {'data': new_data}, {'upsert': true}, function(...));
然后,即使页面已更新,当我执行“查找”以检索缓存时,页面数组仍会反映旧数据。
我的理解是,使用 PageSchema 作为 CacheSchema 声明的一部分的好处是可以链接对象,这样对 Pages 的更新就会反映在 Cache 中。我错过了什么?
显然,我可以将 CacheSchema.pages 更改为 _ids 数组,然后当我想检索缓存时,我将对 PageModel 进行第二次查询以将 _ids 数组转换为对象数组。这将解决问题,但它添加了第二个查询......
谢谢!