【问题标题】:Updating Linked Schemas in Mongoose / Mongo & Node.js在 Mongoose / Mongo 和 Node.js 中更新链接模式
【发布时间】:2012-06-30 10:19:29
【问题描述】:

我在 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 数组转换为对象数组。这将解决问题,但它添加了第二个查询...

谢谢!

【问题讨论】:

  • 您是否 100% 确定您的更新有效?即,如果您只是在更新页面后再次重新获取页面,那么更改是否真的存在?
  • 是的,我 100% 确定。我只是按照你的建议做了。也就是说,我做了一个 PageModel.find({'_id': id_to_update});在 .update() 命令的回调中(并输出结果)。结果正确显示了更新的数据。我什至在那之后添加了另一行来执行 CacheModel.find() ,并确认那里的数据没有改变。

标签: node.js mongodb mongoose


【解决方案1】:

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

这里更典型的选择是,正如您所提到的,将CacheSchema.pages 设为一个_id 数组,然后在需要时使用Mongoose 的populate 支持来跟踪引用到它们的完整对象。所以pagesCacheSchema 中看起来像这样:

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

【讨论】:

  • 太好了,谢谢 - 这是我误会的部分!
猜你喜欢
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2014-05-13
  • 2017-12-07
  • 2016-01-28
  • 2014-10-27
  • 2013-04-03
  • 2016-10-23
相关资源
最近更新 更多