Mongo DB Bson и Java: добавление и возврат поля в дочерних документах, которое присутствует только в родительском?

У меня есть следующая структура документа в моей базе данных космоса (с использованием языка запросов монго):

Ребенок:

    {
    id: doc_123_2
    parent_id: 123
    active: true
}

Родитель:

{
_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)
            }

Обратите внимание: этот вопрос дает мне необработанный результат, который я хочу, когда я запускаю его как запрос монго.

mongoplayground.net/p/F_jGXRLzyg2 . я не работал с драйвером Java, но new Field<>("children.parent_desc", "$parent_desc")
cmgchess 17.04.2024 13:05

@cmgchess, это сработало, спасибо, не стесняйтесь добавлять ответ, чтобы я мог принять :) ценю это

java12399900 17.04.2024 13:12

кстати, почему бы вам не сделать совпадение перед поиском. разве без него это не дает неверных результатов?

cmgchess 17.04.2024 14:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

этап $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"
  }
])

детская площадка

проверив это еще раз - кажется, что дочерние элементы дублируются, а родительский_деск добавляется только к одному из дочерних элементов?

java12399900 07.05.2024 13:42

@java12399900 mongoplayground.net/p/F_jGXRLzyg2 со стадией матча. mongoplayground.net/p/gnxhRupbqDU без сцены матча сверху. ты это имел в виду?

cmgchess 07.05.2024 14:03

Другие вопросы по теме