我的Cosmos DB中有以下文档 struct (使用mongo查询语言):

Child:

    {
    id: doc_123_2
    parent_id: 123
    active: true
}

Parent:

{
_id: doc_123
parent_id: 123
active: true
parent_desc: sample parent desc
}   

在下面的代码中,我试图返回所有与其相关的子文档中的"parent_desc"字段-但是我无法让它填充到子文档中,我做错了什么?

我可以在我的投影方法中手动硬编码该字段,但这不是我想要的-我希望它从父文档中提取.

我想我下面代码中的addFieldsStage似乎没有做任何事情?

private List<Bson> createQuery() {

    List<Bson> pipeline = new ArrayList<>();

    Bson lookupStage = Aggregates.lookup(
            "myCollection",
            "parent_id",
            "parent_id",
            "children"
    );
    pipeline.add(lookupStage);

    // adding parent_desc from parent docs into children?
    Bson addFieldsStage = Aggregates.addFields(
            new Field<>("parent_desc", "$ROOT.parent_desc")
    );
    pipeline.add(addFieldsStage);

    pipeline.add(Aggregates.unwind("$children"));
    pipeline.add(Aggregates.replaceWith("$children"));

    pipeline.add(projectFields());

    return pipeline;
}


 private Bson projectFields() {
    return Aggregates.project(new Document()
            .append("_id", new Document("$cond", Arrays.asList(
                    new Document("$ne", Arrays.asList("$_id", null)),
                    "$_id",
                    "$$REMOVE"
            )))
            .append("parentDesc", new Document("$cond", Arrays.asList(
                    new Document("$ne", Arrays.asList("$parent_desc", null)),
                    "$parent_desc",
                    "$$REMOVE"
            )))
            //... project other fields (working as expected)
            }

Note - this question为我提供了当我将其作为mongo查询运行时想要的原始结果.

推荐答案

$addFields阶段应该看起来像{"children.parent_desc": "$parent_desc"},所以查询变成这样.在Java代码中看起来类似于 Bson addFieldsStage = Aggregates.addFields( new Field<>("children.parent_desc", "$parent_desc") );

db.myCollection.aggregate([
  {
    $lookup: {
      from: "myCollection",
      localField: "parent_id",
      foreignField: "parent_id",
      as: "children"
    }
  },
  {
    $addFields: {
      "children.parent_desc": "$parent_desc"
    }
  },
  {
    $unwind: "$children"
  },
  {
    $replaceWith: "$children"
  }
])

playground

Java相关问答推荐

如何从片段请求数据到活动?在主要活动中单击按钮请求数据?

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

如何在返回bigint []值的子查询中使用any?

Java记录的不同序列化/反序列化

在运行MVN测试时,为什么构建失败,并显示了java.lang.ClassNotFoundException:java.net.http.HttpResponse?

Spring Boot Maven包

无法了解Java线程所消耗的时间

如何从错误通道回复网关,使其不会挂起

Java流传输一个列表并创建单个对象

如何从日志(log)行中删除包名称?

如果按钮符合某些期望,如何修改它的文本?

有没有可能在时间范围内得到多种解决方案?

EXCEL中的公式单元格显示#NAME?

JavaFX标签中的奇怪字符

将BlockingQueue+守护程序线程替换为执行器

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

Java CDI:@Singleton@Startup@Inject无法实现接口

在WHILE()循环初始化部分中声明和初始化变量的Java语法?

如何在java中从以百分比表示的经过时间和结束日期中找到开始日期

Java 8 中 ByteBuffer 和 BitSet 的奇怪行为