#mongodb
#mongodb
Вопрос:
Мне необходимо написать агрегированный запрос, в котором перечислены код темы, название книги и издатель книг. Результаты должны быть перечислены в порядке возрастания для кода темы и в порядке убывания для издателя книг.
Пока что с моим запросом я могу выводить результаты с кодом темы в порядке возрастания, но издатель книг не отсортирован в порядке убывания.
Запрос:
db.Subject.aggregate([{$project:{"subject.subCode":1,"subject.book.bookTitle":1,"subject.book.publisher":1}},{$sort:{"subject.subCode":1,"subject.book.publisher":-1}}]).pretty()
Вывод:
{
"_id" : ObjectId("5fb1ea7658bf7f7d4e10771d"),
"subject" : {
"subCode" : "CSCI103",
"book" : [
{
"bookTitle" : "Introduction to the Design and Analysis of Algorithms",
"publisher" : "Pearson"
},
{
"publisher" : "Pearson"
}
]
}
}
{
"_id" : ObjectId("5fb1ea7658bf7f7d4e10771e"),
"subject" : {
"subCode" : "CSCI114",
"book" : [
{
"bookTitle" : "C Programming - Program design including data structure",
"publisher" : "CENGAGE Learning"
},
{
"bookTitle" : "Starting Out With C : From Control Structures through Objects",
"publisher" : "Addison-Wesley"
}
]
}
}
{
"_id" : ObjectId("5fb1ea7658bf7f7d4e10771f"),
"subject" : {
"subCode" : "CSCI124",
"book" : [
{
"bookTitle" : "Data Structures Using C ",
"publisher" : "CENGAGE Learning"
},
{
"bookTitle" : "C Programming - Program design including data structure",
"publisher" : "CENGAGE Learning"
},
{
"bookTitle" : "Starting Out With C : From Control Structures through Objects",
"publisher" : "Addison-Wesley"
}
]
}
}
{
"_id" : ObjectId("5fb1ea7658bf7f7d4e107721"),
"subject" : {
"subCode" : "CSCI203",
"book" : [
{
"bookTitle" : "Introduction to the Design and Analysis of Algorithms",
"publisher" : "Pearson"
},
{
"bookTitle" : "Introduction to Algorithms",
"publisher" : "The MIT Press"
}
]
}
}
{
"_id" : ObjectId("5fb1ea7658bf7f7d4e107720"),
"subject" : {
"subCode" : "CSCI235",
"book" : [
{
"bookTitle" : "Fundamentals of Database Systems",
"publisher" : "Addison-Wesley"
},
{
"bookTitle" : "Database Management Systems",
"publisher" : "McGraw-Hill"
}
]
}
}
{
"_id" : ObjectId("5fb1ea7658bf7f7d4e107723"),
"subject" : {
"subCode" : "CSCI321"
}
}
{
"_id" : ObjectId("5fb1ea7658bf7f7d4e107722"),
"subject" : {
"subCode" : "IACT201"
}
}
Фрагмент выборки данных:
db.Subject.insert(
{
"_id":ObjectId(),
"subject":{
"subCode":"CSCI235",
"subTitle":"Database Systems",
"credit":3,
"type":"Core",
"prerequisite": ["csci124","csci103"],
"assessments": [
{ "assessNum": 1,
"weight":10,
"assessType":"Assignment",
"description":"Assignment 1 - Normalization and Indexing" },
{ "assignNum": 2,
"weight":10,
"assessType":"Assignment",
"description":"Assignment 2 - PL/SQL programming and Concurrency Control" },
{ "assessNum": 3,
"weight":10,
"assessType":"Assignment",
"description":"Assignment 3 - JSON/BSON and MongoDB" },
{ "assessNum": 4,
"weight":10,
"assessType":"Laboratory",
"description":"Laboraory/Implementation Tasks" },
{ "assessNum": 5,
"weight": 60,
"assessType":"Examination",
"description":"Closed-book Final Examination" }
],
"book": [
{ "ISBN":"13:978-0-136-08620-8",
"bookType":"textbook",
"bookTitle":"Fundamentals of Database Systems",
"edition":6,
"yearPub":2010,
"publisher":"Addison-Wesley",
"author": [ "Ramez Elmasri", "Shamkant B Navathe" ] },
{ "ISBN":"0-07-246563-8",
"bookType":"reference",
"bookTitle":"Database Management Systems",
"edition":3,
"yearPub":2003,
"publisher":"McGraw-Hill",
"author": [ "Raghur Ramakrishnan", "Johannes Gehrke" ] } ]
}
}
)
Как я могу изменить свой запрос, чтобы издатели также сортировались в порядке убывания?
Комментарии:
1. сортировка не происходит внутри массива, она сортирует документы в порядке возрастания с одним и тем же подкодом. В основном сортировка происходит на уровне документа.
2. Есть ли способ обойти это, чтобы я мог выполнить требуемое условие?
3. протестируйте написанный мной код, посмотрите, помогает он или нет
Ответ №1:
Сортировка не происходит внутри массива, она сортирует документы в порядке возрастания с одним и тем же подкодом. В основном сортировка происходит на уровне документа.
Попробуйте это
db.Subject.aggregate([
{$project:{"subject.subCode":1,
"subject.book.bookTitle":1,
"subject.book.publisher":1}
},
{$unwind:"$subject.book"},
{$sort:{
"subject.subCode":1,
"subject.book.publisher":-1
}
}]).pretty()
$unwind
создает новую запись для каждого элемента в массиве.
Комментарии:
1. Отмечено. Ваш ответ дал отличный результат. Я понял, что моя предыдущая запись содержала 2 записи без книг, как показано здесь: { «_id»: ObjectId («5fb1ea7658bf7f7d4e107723»), «subject»: { «subCode»: «CSCI321» } } { «_id»: ObjectId («5fb1ea7658bf7f7d4e107722»), «subject»:{ «subCode»: «IACT201»
2. Могу ли я узнать, почему это произошло?
3. @Frio_Penitencia проверьте
db.Subject.findOne({_id:ObjectId("5fb1ea7658bf7f7d4e107722")})
, есть ли какие-либо проблемы в структуре. возможно, поля пусты4. Да, эти записи пусты, поскольку не все предметы используют книги в своей учебной программе.