I have several hundred records in this format:
{
"_id" : ObjectId( "51ac1356c59151b66c0c9b6b" ),
"name" : "SomeString",
"subject" : [
"_id" : ObjectId( "51ac1356c59151b66c0c912d" ),
"subjectName": "SomeString",
"prerequisite": [ "subject1", "subject2"]
]
}
Here's what the data looks like:
[
{
"_id": "123456",
"name": "StudentB",
"subject": [
{
"_id": "78901",
"subjectName": "Politics 101",
"prerequisite": []
},
{
"_id": "10987",
"subjectName": "Geography 500",
"prerequisite": []
},
{
"_id": "78901",
"subjectName": "Science 500",
"prerequisite": [
"Science 204",
"Math 100"
]
},
{
"_id": "54321",
"subjectName": "Maths 600",
"prerequisite": [
"Science 400",
"Math 400"
]
}
]
},
{
"_id": "654321",
"name": "StudentA",
"subject": [
{
"_id": "78901",
"subjectName": "Music 101",
"prerequisite": []
},
{
"_id": "78901",
"subjectName": "History 500",
"prerequisite": [
"History 200"
]
},
{
"_id": "54321",
"subjectName": "Maths 600",
"prerequisite": [
"Science 400",
"Math 400"
]
},
{
"_id": "10987",
"subjectName": "Geography 500",
"prerequisite": []
}
]
}
]
I am trying to construct a query to get the below result:
[
{
"_id": "654321",
"name": "StudentA",
"subject": [
{
"_id": "78901",
"subjectName": "History 500",
"prerequisite": [
"History 200"
]
},
{
"_id": "54321",
"subjectName": "Maths 600",
"prerequisite": [
"Science 400",
"Math 400"
]
},
{
"_id": "10987",
"subjectName": "Geography 500",
"prerequisite": []
},
{
"_id": "78901",
"subjectName": "Music 101",
"prerequisite": []
}
]
},
{
"_id": "123456",
"name": "StudentB",
"subject": [
{
"_id": "54321",
"subjectName": "Maths 600",
"prerequisite": [
"Science 400",
"Math 400"
]
},
{
"_id": "78901",
"subjectName": "Science 500",
"prerequisite": [
"Science 204",
"Math 100"
]
},
{
"_id": "10987",
"subjectName": "Geography 500",
"prerequisite": []
},
{
"_id": "78901",
"subjectName": "Politics 101",
"prerequisite": []
}
]
}
]
Here's what I have tried so far:
studentDetails.aggregate([
{
$project: {
'_id': 1,
'name': 1,
'subject.subjectName': 1,
'subject.prerequisite': 1
}
},
{
$unwind: '$subject'
},
{
$sort: {
'subject.prerequisite': -1
}
},
{
$group: {
_id: '$_id',
subject: { $push: '$subject' },
name: { $first: '$name' },
}
}
]);
The above aggregation returns the subdocuments sorted in reverse alphabetical order where the prerequisites are ordered from Z-A and the empty arrays are at the end of the list.
I need to sort the documents in the DB according to:
- The name of the students (A-Z)
- Name of the subject where the subjects with prerequisites are returned at the beginning of the resulting query