0

Я новичок в использовании рамок агрегации 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?

+0

Не могли бы вы добавить образец документ для тестирования? – notionquest

ответ

0

Вы можете запустить следующую агрегацию трубопровода, который предполагает у вас есть модель BookSold, которая использует bookSoldSchema выше, books и bookcategories, лежащие в основе коллекции:

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)); 
}) 
+0

Большое спасибо @chridam, 3 лучших книги категории - это не первая 3-х книга, я бы хотел получить 3 самых продаваемых в этой категории, это означает верхний счет (bookId) этой категории. Не могли бы вы помочь? –

Смежные вопросы