У меня есть следующая структура документа в моей базе данных космоса (с использованием языка запросов монго):
Ребенок:
{
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)
}
Обратите внимание: этот вопрос дает мне необработанный результат, который я хочу, когда я запускаю его как запрос монго.
@cmgchess, это сработало, спасибо, не стесняйтесь добавлять ответ, чтобы я мог принять :) ценю это
кстати, почему бы вам не сделать совпадение перед поиском. разве без него это не дает неверных результатов?
этап $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 mongoplayground.net/p/F_jGXRLzyg2 со стадией матча. mongoplayground.net/p/gnxhRupbqDU без сцены матча сверху. ты это имел в виду?
new Field<>("children.parent_desc", "$parent_desc")