【问题标题】:MongoDB TTL consistencyMongoDB TTL 一致性
【发布时间】:2013-10-22 15:17:51
【问题描述】:
  • MongoDB 是否处理来自 TTL 集合的链接文档的一致性?

例如:如果“用户”模型指的是一个 TTL 集合,并且其中一个链接的用户因为太旧而被删除,那么它与各个组的链接是否会被删除?

var GroupSchema = new Schema({
    users           : [{
        type        : Schema.Types.ObjectId, ref: 'User'
    }]
});

mongoose.model('Group', GroupSchema);
  • 如果不是,处理因 TTL 而被删除的链接文档列表的最佳做法是什么?

在 CouchDB 中,您可以监听由 I/O 操作触发的事件,我认为,是否有任何类似的机制已经到位或目前正在为 MongoDB 实现?

如果重要的话,我使用的是 Node.js Mongoose ODM。

提前谢谢你!

【问题讨论】:

  • MongoDB 没有连接服务器端,因此没有,它没有。至于最佳实践,如果删除原始文档后一切都无用,那么是什么阻止您嵌套文档?
  • 加入与我的问题有什么关系?该问题与 TTL 集合的已删除文档的链接下落有关。
  • 需要 JOIN 以确保链接文档的引用完整性

标签: mongodb mongoose consistency ttl


【解决方案1】:

MongoDB 不强制引用完整性。

MongoDB 没有触发器。

当一个文档被删除时,应用程序有责任确保所有引用的文档也被删除,并且指向它的所有引用都被删除或更新。当文档结束 TTL 是一个需要做的不仅仅是删除一个文档的事件时,数据库上的 TTL 功能不足以完成这项工作,您需要在应用程序级别创建不同的解决方案。

顺便说一句:当一个对象拥有许多没有它就没有意义的孩子(组合的情况,而不是聚合的情况)时,在 MongoDB 中将孩子嵌入到父文档中通常是有意义的而不是将它们作为单独的文档。这样它们就会与父级一起被删除。

此外,您应该始终问自己是否真的需要真正删除数据,以及通过在其上设置标志将其标记为已删除是否更明智。如果发生用户错误,删除删除标志很容易,但恢复数据库上的硬删除则不是。

【讨论】:

  • 但是对于 TTL 集合,嵌入不是解决方案,因为您必须在丢失该 TTL 功能和删除整个组之间做出选择,对吧?
  • @m_vdbeek 如果组不拥有其成员,并且将其与组一起删除没有意义,则不应嵌入它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多