Проблема MongoDB с сортировкой при использовании aggregate

#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. Да, эти записи пусты, поскольку не все предметы используют книги в своей учебной программе.