mongodb聚类按类别划分

时间:2016-09-18 06:57:00

标签: mongodb mongoose mongodb-query aggregation-framework mongodb-aggregation

我是使用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'}],
 })

每本书都有多个类别,我想展示前五大畅销书类别,每个类别我需要展示最畅销的三大书,我还需要显示类别名称,我需要的结果是:

[
      {
        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 个答案:

答案 0 :(得分:0)

您可以运行以下聚合管道,假设您拥有使用上面BookSoldbookSoldSchemabooks基础集合的模型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));
})
相关问题