【问题标题】:How to query for documents with invalid references using spring data mongodb如何使用spring data mongodb查询具有无效引用的文档
【发布时间】:2017-09-13 17:26:47
【问题描述】:

假设我们有一个集合 A,它通过一个名为“bref”的字段引用集合 B,该字段是集合 B 中的 ObjectId 的数组。对于集合 A,我感兴趣的可能有 4 种情况:

  1. 至少一个 bref 数组项指向来自 B 的有效文档。
  2. bref 数组为空。
  3. bref 数组不存在(因此为空)。
  4. bref 数组中的所有项目均未指向有效的 B 文档。

在 spring-data 中,使用 MongoRepository,我能够从上面解决如下情况:

  1. getByBrefLike(ObjectId brefId, Pageable pageable)
  2. getByBrefIsNullOrBrefIsLessThanEqual(String[] emptyString, Pageable pageable)
  3. getByBrefIsNullOrBrefIsLessThanEqual(String[] emptyString, Pageable pageable)
  4. 尚未解决。

问题:

  1. 是否可以像我在上面的示例中那样使用 spring-data mongodb 存储库来检测 A 中指向 B 中不存在的引用的文档?
  2. 您将如何防止这种情况发生? (是否可以定义一些约束)?
  3. 如果无法使用 spring-data 解决方案,那么 mongodb 解决方案会是什么样子?

【问题讨论】:

    标签: java spring mongodb spring-boot spring-data-mongodb


    【解决方案1】:

    试试这个

    Pageable<T> findByBrefNotIn(List<ObjectId> brefs, Pageable, pageable)
    

    【讨论】:

    • 我认为这行不通,因为我不知道您的回复中的 brefs 列表中的项目是什么。我需要动态检测“孤立”值。更简洁地说,如果我们有一个书籍列表,并且每本书都附加了一个作者 ID 列表,我需要从作者表中检测包含至少一个无效作者 ID 的书籍记录(作者可能已被删除,并且删除操作是可能的,因为没有对两个集合施加约束)。
    • 在您提出的问题中,“bref 数组中的所有项目均未指向有效的 B 文档。” .现在您说“包含至少一个无效的记录”。这两个并不完全相同。问题不正确或您给出的示例:)
    • 其实差别不大。检测至少一个引用 id 无效的记录将是完美的解决方案,但至少检测没有任何引用 id 指向另一个表中的有效记录的记录也足够了。但是您的答案甚至没有接近任何这些情况。我有两个集合 A 和 B,A 有一个 id 数组,指向 B 中的(有效或无效)记录。我需要从 A 表中动态获取这些记录并显示它们。
    • 如果我在这里错了,请纠正我,对于第 1 点,您希望从 A 动态获取所有记录,其中至少一个 bref 数组项指向 B 的有效文档。然后在这种情况下您将哪个 brefId 传递给 getByBrefLike(ObjectId brefId, Pageable pageable)。我只是好奇这是如何工作的?
    • 不,这不是我想要的。我有一个带有作者的树结构和一个带有书籍的网格视图。选择作者后,我会刷新网格并显示他的所有书籍。书籍存储在表“books”中,作者存储在表“authors”中,每本书都有一组相关的作者。一切都很好,除非一本书: 1. 没有作者集; 2.他所有的“作者”数组元素都指向不存在的作者。我想汇总 1 和 2 个案例,以显示人工作者树项目。单击此项目时,所有“作者无效”的书籍都必须显示在网格中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2021-09-15
    相关资源
    最近更新 更多