Здесь мне просто нужно найти три таблицы, сначала нужно получить все темы из таблицы тем в соответствии с classid и boardid, затем из таблицы содержимого нам нужно получить все детали темы и контента и сгруппировать их по идентификатору темы (пожалуйста, посмотрите ожидаемый результат) . тогда каждая информация о теме должна содержать дочернюю информацию, которую мы получим из таблицы edchildrevisioncompleteschemas. #код поиска
const { stageid, subjectid, boardid, scholarshipid, childid } = req.params;
edcontentmaster
.aggregate([
{
$match: {
stageid: stageid,
subjectid: subjectid,
boardid: boardid,
// scholarshipid: scholarshipid,
},
},
{
$addFields: {
convertedField: {
$cond: {
if: { $eq: ["$slcontent", ""] },
then: "$slcontent",
else: { $toInt: "$slcontent" },
},
},
},
},
{
$sort: {
slcontent: 1,
},
},
{
$lookup: {
from: "edchildrevisioncompleteschemas",
let: { childid: childid, subjectid:subjectid,topicid:"$topicid" },
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$childid",
"$$childid"
]
},
{
$in: [
"$$subjectid",
"$subjectDetails.subjectid"
]
},
{
$in: [
"$$topicid",
{
$reduce: {
input: "$subjectDetails",
initialValue: [],
in: {
$concatArrays: [
"$$value",
"$$this.topicDetails.topicid"
]
}
}
}
]
}
]
}
}
},
{
$project: {
_id: 1,
childid: 1
}
}
],
as: "studenttopic",
},
},
{
$group: {
_id: "$topic",
topicimage: { $first: "$topicimage" },
topicid: { $first: "$topicid" },
sltopic: { $first: "$sltopic" },
studenttopic: { $first: "$studenttopic" },
reviewquestionsets: {
$push: {
id: "$_id",
sub: "$sub",
topic: "$topic",
contentset: "$contentset",
stage: "$stage",
timeDuration: "$timeDuration",
contentid: "$contentid",
studentdata: "$studentdata",
subjectIamge: "$subjectIamge",
topicImage: "$topicImage",
contentImage: "$contentImage",
isPremium: "$isPremium",
},
},
},
},
{
$project: {
_id: 0,
topic: "$_id",
topicimage: 1,
topicid: 1,
sltopic: 1,
studenttopic:1,
contentid: "$contentid",
reviewquestionsets: 1,
},
},
])
.sort({ sltopic: 1 })
.collation({
locale: "en_US",
numericOrdering: true,
})
из приведенного выше запроса я получаю соответствующие данные для одного предмета, но мне нужны все предметы из таблицы предметов, и каждый предмет должен иметь данные того же формата, что я получаю для одного предмета, ex-mongoplayground.net/p/LoxSBI3jZL-
текущий выход-
[
{
"reviewquestionsets": [
{
"contentid": "NVOOKADA1690811843420STD-5EnglishThe Monkey
from RigerLesson - 1",
"contentset": "Lesson - 1",
"id": ObjectId("64ccd53792362c7639d3da5f"),
"stage": "STD-5",
"timeDuration": "15",
"topic": "The Monkey from Riger"
},
{
"contentid": "NVOOKADA1690811843420STD-5EnglishThe Monkey
from RigerLesson - 3",
"contentset": "Lesson - 3",
"id": ObjectId("64ccf5ca92362c7639d3f145"),
"isPremium": true,
"stage": "STD-5",
"timeDuration": "5",
"topic": "The Monkey from Riger"
}
],
"sltopic": "1",
"studenttopic": [
{
"_id": ObjectId("659580293aaddf7594689d18"),
"childid": "WELL1703316202984"
}
],
"topic": "The Monkey from Riger",
"topicid": "1691144002706",
"topicimage": ""
}
]
ожидаемый результат-
[
{
"_id": "64cc9a2656738e9f1507f521",
"subjectid": "1691130406151",
"subject": "English",
"subjectImage": "https://wkresources.s3.ap-south-
1.amazonaws.com/1691761437925_644750345.png",
"stageid": "5",
"stage": "STD-5",
"boardid": "1",
"boardname": "BSE",
"scholarshipid": "NVOOKADA1690811843420",
"scholarshipname": "Adarsh",
"createon": "2023-08-04T06:26:46.154Z",
"updatedon": "2023-08-14T13:07:16.256Z",
"__v": 0,
"slsubject": "1",
"topicDetails": {
"reviewquestionsets": [
{
"contentid": "NVOOKADA1690811843420STD-5EnglishThe Monkey
from RigerLesson - 1",
"contentset": "Lesson - 1",
"id": "64ccd53792362c7639d3da5f",
"stage": "STD-5",
"timeDuration": "15",
"topic": "The Monkey from Riger"
},
{
"contentid": "NVOOKADA1690811843420STD-5EnglishThe Monkey
from RigerLesson - 3",
"contentset": "Lesson - 3",
"id": "64ccf5ca92362c7639d3f145",
"isPremium": true,
"stage": "STD-5",
"timeDuration": "5",
"topic": "The Monkey from Riger"
}
],
"sltopic": "1",
"studenttopic": [
{
"_id": "659580293aaddf7594689d18",
"childid": "WELL1703316202984"
}
],
"topic": "The Monkey from Riger",
"topicid": "1691144002706",
"topicimage": ""
}
}
]
$group перед $lookup, но в коде в вашем вопросе есть $lookup перед $group. Так что же это? Вы сказали «не получили подходящего результата», но не объяснили, что вы получаете и почему в вашем примере это неверно. Ваш последний абзац очень тяжело читать. Вам просто нужны все edchildrevisioncompleteschemas по всем темам, связанным с определенной темой? Идентификатор субъекта в вашем примере 1691130406151 не существует в subjects, только в edcontentmaster.
Обновленный вопрос, извините за путаницу. Пожалуйста, проверьте, что ключ коллекции edchildrevisioncompleteschemas — «subjectDetails». Там присутствует «subjectid»: «1691130406151». Получение ожидаемого результата для одного предмета, но теперь нужно найти все подробности предмета.





Вам следует присоединиться к коллекции тем у edcontentmaster через $lookup. pipeline на этапе $lookup должен быть вашим существующим запросом.
На последнем этапе преобразуйте topicDetails в объект, получив первый элемент.
db.subject.aggregate([
{
$match: {
stageid: "5",
boardid: "1",
scholarshipid: "NVOOKADA1690811843420"
}
},
{
$lookup: {
from: "edcontentmaster",
let: {
stageid: "$stageid",
subjectid: "$subjectid",
boardid: "$boardid",
scholarshipid: "$scholarshipid"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$stageid",
"$$stageid"
]
},
{
$eq: [
"$subjectid",
"$$subjectid"
]
},
{
$eq: [
"$boardid",
"$$boardid"
]
},
{
$eq: [
"$scholarshipid",
"$$scholarshipid"
]
}
]
}
}
},
{
$addFields: {
convertedField: {
$cond: {
if: {
$eq: [
"$slcontent",
""
]
},
then: "$slcontent",
else: {
$toInt: "$slcontent"
}
}
}
}
},
{
$sort: {
slcontent: 1
}
},
{
$group: {
_id: "$topic",
topicimage: {
$first: "$topicimage"
},
topicid: {
$first: "$topicid"
},
sltopic: {
$first: "$sltopic"
},
studenttopic: {
$first: "$studenttopic"
},
reviewquestionsets: {
$push: {
id: "$_id",
sub: "$sub",
topic: "$topic",
contentset: "$contentset",
stage: "$stage",
timeDuration: "$timeDuration",
contentid: "$contentid",
studentdata: "$studentdata",
subjectIamge: "$subjectIamge",
topicImage: "$topicImage",
contentImage: "$contentImage",
isPremium: "$isPremium"
}
}
}
},
{
$lookup: {
from: "edchildrevisioncompleteschemas",
let: {
childid: "WELL1703316202984",
//childid,
subjectid: "1691130406151",
//subjectid,
topicid: "$topicid"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$childid",
"$$childid"
]
},
{
$in: [
"$$subjectid",
"$subjectDetails.subjectid"
]
},
{
$in: [
"$$topicid",
{
$reduce: {
input: "$subjectDetails",
initialValue: [],
in: {
$concatArrays: [
"$$value",
"$$this.topicDetails.topicid"
]
}
}
}
]
}
]
}
}
},
{
$project: {
_id: 1,
childid: 1
}
}
],
as: "studenttopic"
}
},
{
$project: {
_id: 0,
topic: "$_id",
topicimage: 1,
topicid: 1,
sltopic: 1,
studenttopic: 1,
contentid: "$contentid",
reviewquestionsets: 1
}
}
],
as: "topicDetails"
}
},
{
$set: {
topicDetails: {
$first: "$topicDetails"
}
}
}
])
Вот вы и пропустили одиночный субъектид. но нам нужно отфильтровать все предметы по их идентификатору этапа, идентификатору доски и идентификатору стипендии.
В этом случае удалите критерии фильтра subjectid на первом этапе $match.
да, но если существует более одной темы с разными идентификаторами тем, но под одним идентификатором темы используется только одна тема, пожалуйста, проверьте mongoplayground.net/p/Sjhpx5xV13T
Здесь themeDetails должен быть массивом, а каждая отдельная тема должна быть объектом. как предметный массив
Ожидаемый результат: topicDetails — это объект, а не массив. Я думаю, вам нужно знать, как различать, что такое массив ([]) и что такое объект ({}).
edSubject.aggregate([
{
$match: {
stageid: stageid,
boardid: boardid,
scholarshipid: scholarshipid,
},
},
{
$lookup: {
from: "edcontentmasterschemas",
let: {
stageid: "$stageid",
subjectid: "$subjectid",
boardid: "$boardid",
scholarshipid: "$scholarshipid",
},
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ["$stageid", "$$stageid"] },
{ $eq: ["$subjectid", "$$subjectid"] },
{ $eq: ["$boardid", "$$boardid"] },
{ $eq: ["$scholarshipid", "$$scholarshipid"] },
],
},
},
},
{
$addFields: {
convertedField: {
$cond: {
if: { $eq: ["$slcontent", ""] },
then: "$slcontent",
else: { $toInt: "$slcontent" },
},
},
},
},
{ $sort: { slcontent: 1 } },
{
$group: {
_id: "$topicid",
topicimage: { $first: "$topicimage" },
topic: { $first: "$topic" },
sltopic: { $first: "$sltopic" },
studenttopic: { $first: "$studenttopic" },
reviewquestionsets: {
$push: {
id: "$_id",
sub: "$sub",
topic: "$topic",
contentset: "$contentset",
stage: "$stage",
timeDuration: "$timeDuration",
contentid: "$contentid",
studentdata: "$studentdata",
subjectIamge: "$subjectIamge",
topicImage: "$topicImage",
contentImage: "$contentImage",
isPremium: "$isPremium",
},
},
},
},
{
$addFields: {
convertedField: {
$cond: {
if: { $eq: ["$slcontent", ""] },
then: "$slcontent",
else: { $toInt: "$slcontent" },
},
},
},
},
{ $sort: { sltopic: 1 } },
{
$lookup: {
from: "edchildrevisioncompleteschemas",
let: {
childid: childid,
//childid,
//subjectid,
topicid: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$childid",
"$$childid"
]
},
{
$in: [
"$$topicid",
{
$reduce: {
input: "$subjectDetails",
initialValue: [],
in: {
$concatArrays: [
"$$value",
"$$this.topicDetails.topicid"
]
}
}
}
]
}
]
}
}
},
{
$project: {
_id: 1,
childid: 1
}
}
],
as: "studenttopic"
}
},
{
$project: {
_id: 0,
topic: "$_id",
topicimage: 1,
topicid: 1,
sltopic: 1,
studenttopic: 1,
contentid: "$contentid",
reviewquestionsets: 1,
},
},
],
as: "topicDetails",
},
},
{ $unwind: "$topicDetails" },
{
$group: {
_id: "$_id",
subject: { $first: "$subject" },
subjectid: { $first: "$subjectid" },
slsubject: { $first: "$slsubject" },
topicDetails: { $push: "$topicDetails" },
},
},
])
db.edSubject.aggregate([
{
$match: {
stageid: stageid,
boardid: boardid,
scholarshipid: scholarshipid,
}
},
{
$lookup: {
from: "edcontentmasterschemas",
let: {
stageid: "$stageid",
subjectid: "$subjectid",
boardid: "$boardid",
scholarshipid: "$scholarshipid",
},
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ["$stageid", "$$stageid"] },
{ $eq: ["$subjectid", "$$subjectid"] },
{ $eq: ["$boardid", "$$boardid"] },
{ $eq: ["$scholarshipid", "$$scholarshipid"] },
]
}
}
},
{
$sort: { slcontent: 1 }
},
{
$group: {
_id: "$topicid",
topicDetails: { $first: "$$ROOT" }
}
},
{
$lookup: {
from: "edchildrevisioncompleteschemas",
let: { topicid: "$_id", childid: childid },
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ["$childid", "$$childid"] },
{ $in: ["$$topicid", "$subjectDetails.topicDetails.topicid"] }
]
}
}
},
{ $project: { _id: 1 } }
],
as: "studenttopic"
}
},
{
$addFields: {
"topicDetails.studenttopic": { $arrayElemAt: ["$studenttopic", 0] } .
}
},
{
$replaceRoot: { newRoot: "$topicDetails" }
},
{
$sort: { sltopic: 1 }
}
],
as: "topicDetails",
}
},
{
$group: {
_id: "$_id",
document: { $first: "$$ROOT" },
topicDetails: { $push: "$topicDetails" }
}
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: ["$document", { topicDetails: "$topicDetails" }]
}
}
}
])
Ваш ответ можно улучшить, добавив дополнительную информацию о том, что делает код и как он помогает ОП.
Предоставьте несколько примеров данных для запуска конвейера агрегации.