在我的MongoDBCollection 中,我有一个遵循父子 struct 的文档.

每个父文档通常有4个字段,子文档有3个(没有组字段).

parent:

{
_id: doc_123
parent_id: 123
active: true
group: A
}

children

{
id: doc_123_1
parent_id: 123
active: true
}

{
id: doc_123_2
parent_id: 123
active: true
}

如果需要,我想为我的Java Spring项目编写一个BSON查询/聚合,它将返回与用户提供的以下字段匹配的所有文档:

  • 活动字段-这将是真或假
  • 组字段-例如"A"

我的困难在于,假设每个子文档与组字段的父文档具有相同的值,但它实际上不在文档中.

如何编写匹配某个组的所有父文档和子文档的查询?

所有文档都在一个集合中,父文档和子文档没有单独的集合.

推荐答案

加入家长在加入时添加团体条件:

db.collection.aggregate([
  {
    // self-join on child.parent_id -> parent.parent_id
    $lookup: {
      from: "collection",
      localField: "parent_id",
      foreignField: "parent_id",
      "pipeline": [
        {
          "$match": {
            "group": "$$group" // pass "A" as "group" parameter to the query
          }
        }
      ],
      as: "parent"
    }
  },
  {
    $match: {
      active: $$active, // pass true or false as "active" parameter to the query
      group: {
        $exists: false // exclude parents which join to themselves
      }
    }
  }
])

live demo.

将此查询定义为spring Boot Repository中的原生查询,并传递给它两个命名参数(名为"group"和"active").

Java相关问答推荐

当我用OkHttpClient重写shouldInterceptRequest来发布数据时,Android WebView正在以纯HTML加载URL内容

使用包私有构造函数强制子类Java类

Java自定义ThreadPool—暂停任务提交并取消当前排队任务

Jooq外键关系

XPages-在第二次点击按钮之前延迟

如何使用值中包含与号的查询参数创建一个java.net.URI

更新AWS凭据

有没有更快的方法在N个容器中删除重复项?

使用Jackson库反序列化json

buildDir:File!&#的getter解决方案是什么?39.被抛弃

是否有一个Java Future实现可以在池繁忙时在调用者线程中执行?

Java 21中泛型的不兼容更改

循环不起作用只有第一个元素重复

JXBrowser是否支持加载Chrome扩展?

读取ConcurrentHashMap中的可变对象

简化每个元素本身都是 map 列表的列表

当我将鼠标悬停在javafxTextArea上时,如何更改鼠标光标?

[Guice/MissingImplementation]:未绑定任何实现

人们在 IntelliJ 上将-Dhttp.proxyHost=your.proxy.net -Dhttp.proxyPort=8080放在哪里?

Vaadin Flow:设置密码显示按钮属性