问题是:

我在集合A中有一个文档,当它第一次被创建时,它没有被任何其他文档引用.在某个时刻,将创建集合B中的文档,它将引用集合a中文档的ObjectId.

查找集合A中未被集合B中的I文档引用的所有文档的最佳方法是什么?

我知道MongoDB不支持连接,但我想知道除了从集合B获取所有引用的ObjectID并在集合a中查找不在该列表中的文档之外,是否还有其他解决方案,因为这种解决方案可能无法很好地扩展.

我可以将集合A中的文档嵌入集合B中的文档,然后将其从集合A中删除吗?这是最好的解决方案吗?

谢谢你的帮助和 comments .

推荐答案

有很多 Select :

1) 将B文档的id添加到A文档中的数组(反向引用).现在,您可以查找在该数组中没有任何元素的文档.问题:如果有大量交叉引用,数组可能会变得太大,无法容纳文档大小.

2) 添加一个集合C来跟踪a和B之间的引用.其行为类似于联接表.

3) 在"引用"中有一个简单的标志.当你添加一个B时,把它引用的所有a标记为"引用".当你删除一个B时,扫描B中所有被它引用的a,并取消任何不再有引用的a.问题:可能会失go 同步.

4) 使用B上的map reduce创建一个集合,其中包含任何B引用的所有a的ID.使用该集合标记所有被引用的a(在首先取消标记所有a之后).可以使用它定期修复(3).

5) 将两种文档类型放在同一个集合中,并使用map reduce发出_id和一个标记,表示"在a中"或"被B引用".在"减少"步骤中,查找"在A中"但"未被B引用"的任何组.

...

Mongodb相关问答推荐

MongoDB中的数据类型没有通过数据库Pyspark更改(从字符串到日期)

从MongoDB中的一个非空字段获取值

MongoDB与合并对象聚合

使用MongoDB 4将根文档替换为数组

MongoDB获取所有文档谁的S子文档只包含一个特定值?

MongoDB即使在使用索引时也很慢

为什么使用 Golang Mongo 驱动程序进行简单查询需要超过 2 秒?

MongoDB shell:如何删除列表以外的所有集合

使用golang的MongoDB错误无法访问服务器

Mongodb聚合中基于其他字段值的多个条件的动态新字段值

Nestjs中不同语言数据的mongodb聚合代码

_id 和 $oid 的区别; mongo 数据库中的 $date 和 IsoDate

类型错误:db.close is not a function

使用 Spring Boot >= 2.0.1.RELEASE 将 ZonedDateTime 保存到 MongoDB 时出现 CodecConfigurationException

Mongodb插入没有_id字段的文档

$lookup 结果 mongodb 的计数

MongoDB 3 Java判断集合是否存在

MongoDB 中的所有列

Mongoose / MongoDB 用户通知方案建议

在 MongoDB 上分片 GridFS