Mongodb агрегатная группа по категориям

Я новичок в использовании механизма агрегирования MongoDB, и здесь у меня есть схема ниже:

var bookSoldSchema = new Schema({
   buyer:{
      type: Number
   }
   book: {         
     type: Schema.Types.ObjectId, ref: 'Book'
   } 
});

 var bookSchema = new Schema({
     bookName: { type: String },
     categories: [{ type: Schema.Types.ObjectId, ref: 'BookCategory'}],
 })

Каждая книга имеет несколько категорий, я хотел бы показать 5 лучших категорий бестселлеров, и в каждой категории мне нужно показать 3 лучшие книги, которые были проданы больше всего, и мне также нужно показать название категории, результаты, которые мне нужны:

[
      {
        categoryId: xxx,
        categoryName:xxx,
        top3books:[
           {bookId:xxx, bookName:xxx},
           {bookId:xxx, bookName:xxx},
           {bookId:xxx, bookName:xxx},
        ]
     },
     {
       categoryId: xxx,
       categoryName:xxx,
       top3books:[
          {bookId:xxx, bookName:xxx},
          {bookId:xxx, bookName:xxx},
          {bookId:xxx, bookName:xxx},
       ]
    }
]

Как я могу сделать это в MongoDB?

1 ответ

You can run the following aggregation pipeline which assumes you have a model BookSold который использует bookSoldSchema выше, books а также bookcategories underlying collections:

BookSold.aggregate([
    {
        "$lookup": {
            "from": "books",
            "localField": "book",
            "foreignField": "_id",
            "as": "book_join"
        }
    },
    { "$unwind": "$book_join" },
    { "$unwind": "$book_join.categories" },
    {
        "$lookup": {
            "from": "bookcategories",
            "localField": "book_join.categories",
            "foreignField": "_id",
            "as": "categories"
        }
    },
    { "$unwind": "$categories" },
    { "$sort": { "categories.name": 1, "buyer": -1 } }, 
    {
        "$group": {
            "_id": "$categories.name",
            "categoryId": { "$first": "$categories._id" },
            "buyer": { "$first": "$buyer" },
            "books": { 
                "$push": { 
                    "bookId": "$book_join._id", 
                    "bookName": "$book_join.bookName" 
                } 
            }
        }
    },
    { "$sort": { "buyer": -1 } },
    { "$limit": 5 },
    {
       "$project": {
           "_id": 0,
           "categoryId": 1,
           "categoryName": "$_id",
           "top3books": { "$slice": [ "$books", 3 ] }
       }
    }
], function(err, result) {
    if (err) handleError(err);
    console.log(JSON.stringify(result, null, 4));
})
Другие вопросы по тегам