【问题标题】:Mongo: Fetching documents that aren't referenced in another collectionMongo:获取另一个集合中未引用的文档
【发布时间】:2012-09-14 09:48:26
【问题描述】:

假设我的 Mongo 数据库中有两个集合:AB。每个A 文档可能有对B 的引用,但B 文档没有对A 的引用。

如何有效地找到B未被A 中的文档引用的所有文档?

有没有比检索B 中的所有文档并手动与A 文档进行比较更有效的方法?这可以用 map reduce 来完成吗?

我是否应该考虑添加从BA 的引用来支持查询?由于 Mongo 不支持事务,因此我避免了任何两种方式的引用,以避免在发生故障时出现任何不一致的状态。

此外,如果这会影响解决方案,我需要能够有效地浏览这些结果。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    在伪代码中:

    // Get the set of B document ids that are referenced by A documents.
    var bref_ids = db.A.distinct('b_id');
    
    // Get the set of all other B documents.
    var unreferenced_b_docs = db.B.find({_id: {$nin: bref_ids}});
    

    【讨论】:

    • 谢谢,约翰尼。我希望有一种更有效的方法,但我开始认为我应该将B 的引用添加回A。查询会很简单,但我需要添加一些逻辑来处理数据库中由于更新时出现某些错误而导致的任何不一致的解决方案。
    • 如果可能的话,我会避免反向引用。不一致的机会太多。如果您在A 集合中为b_id 属性添加索引,则性能应该不错。显然,这取决于您的具体情况。
    • 警告 - 这不会扩展。 distinct 操作的最大数据大小限制为 16mb。
    • @EladNava 是的,有一个限制,但 16MB 包含超过一百万个 12 字节对象 ID。
    猜你喜欢
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    相关资源
    最近更新 更多