更新Mongoose / Mongo中的链接模式& Node.js的

时间:2012-06-29 18:21:44

标签: node.js mongodb mongoose

我在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声明的一部分的好处是对象将被链接,以便页面的更新反映在Cache中。我错过了什么?

显然,我可以将CacheSchema.pages改为_ids数组,然后当我想要检索缓存时,我会在PageModel上进行第二次查询,将_ids数组转换为一个对象数组。这可以解决问题,但它增加了第二个查询......

谢谢!

1 个答案:

答案 0 :(得分:3)

你误解了Mongoose / Mongo中的嵌入式文档概念。将页面文档嵌入到缓存文档中的数组中会创建具有相同_id值的页面文档的独立副本。如果您想使用此架构设计,则需要确保对pages集合中的文档所做的任何更改也都对pages文档的嵌入式caches数组进行了更改。 1}}集合。

如你所提到的,更典型的选择是使CacheSchema.pages成为一个_ids数组,但是在需要时使用Mongoose的populate支持来跟随refs到它们的完整对象。因此pages中的CacheSchema看起来像这样:

pages: [{ type: Schema.ObjectId, ref: 'pages' }]