2016-08-26 70 views
6

我很難解決這個mongodb(mongoose)問題。

有架構Guess_idtitletags)與tags是tags_id的陣列(從Tag模式被引用)。

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var schema = mongoose.Schema({ 
    title: { 
     type: Schema.Types.Mixed, 
     required: true 
    }, 
    tags: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'Tag', 
     required: false, 
     default: [] 
    }] 
}); 
schema.index({ '$**': 'text' }); 

module.exports = mongoose.model('Guess', schema); 

文件的例子:

{ 
    "_id" : ObjectId("578857529507cafd5fe1f9b3"), 
    "title" : { 
     "en" : "Will Amazon start its first drone deliveries this year?" 
    }, 
    "tags" : [ 
     ObjectId("578857529507cafd5fe1f9b7"), 
     ObjectId("578857529507cafd5fe1f9b6") 
    ] 
} 
{ 
    "_id" : ObjectId("578857a59507cafd5fe1f9bb"), 
    "title" : { 
     "en" : "Will Singapore 3D print homes during 2016?" 
    }, 
    "tags" : [ 
     ObjectId("578857a59507cafd5fe1f9bf"), 
     ObjectId("578857529507cafd5fe1f9b6") 
    ] 
} 
...... 
..... 

我需要得到最熱門的標籤(標籤)的列表。上面我向您展示架構和我的解決方案貓鼬查詢。

Guess.aggregate([ 
       { 
        "$project": { 
         "_id": 1, 
         "tags": 1 
        } 
       }, 
       { 
        "$unwind": "$tags" 
       } 
       // , 
       // { 
       // "$group": { 
       //  "tags": '$tags.tags', 
       //  "count": {"$sum": 1} 
       // } 
       // }, 
       // {"$sort": {"count": -1}}, 
       // {"$limit": 5} 
      ], function (error, result) { 
       // 
      }); 

如果我評論此選項

 { 
      "$group": { 
       "tags": '$tags.tags', 
       "count": {"$sum": 1} 
      } 
     }, 
     {"$sort": {"count": -1}}, 
     {"$limit": 5} 

然後我查詢的結果是

[ { _id: 578857529507cafd5fe1f9b3, 
    tags: 578857529507cafd5fe1f9b7 }, 
    { _id: 578857529507cafd5fe1f9b3, 
    tags: 578857529507cafd5fe1f9b6 }, 
    { _id: 578857a59507cafd5fe1f9bb, 
    tags: 578857a59507cafd5fe1f9bf }, 
    { _id: 578857a59507cafd5fe1f9bb, 
    tags: 578857a59507cafd5fe1f9be }, 
    { _id: 578857d637cc983f60774fcb, 
    tags: 578857d637cc983f60774fcf }, 
    { _id: 578857d637cc983f60774fcb, 
    tags: 578857d637cc983f60774fce }, 
    { _id: 578f2cbe875ec80f11e49a66, 
    tags: 578f2cbe875ec80f11e49a6a }, 
    { _id: 578f2e25b470bb62115f1741, 
    tags: 578f2e25b470bb62115f1745 }, 
    { _id: 578f2f119cd9848c1180be8b, 
    tags: 578f2f119cd9848c1180be8f }, 
    { _id: 578f2f119cd9848c1180be8b, 
    tags: 578f2f119cd9848c1180be8e }, 
    { _id: 578f50876a3ba88d13aed982, 
    tags: 578f50876a3ba88d13aed986 }, 
    { _id: 578f50876a3ba88d13aed982, 
    tags: 578f50876a3ba88d13aed985 }, 
    { _id: 578f510c6a3ba88d13aed989, 
    tags: 578f510c6a3ba88d13aed98c }, 
    { _id: 578f510c6a3ba88d13aed989, 
    tags: 578f510c6a3ba88d13aed98d } ] 

我去掉那麼這個查詢錯誤。我想要組tag並顯示5個最受歡迎的標籤。如何解決它?

的結果,我想看起來像

[ { tags: 578857529507cafd5fe1f9b6, count: 10 }, 
    { tags: 578857529507cafd5fe1f9b7, count: 9 }, 
    { tags: 578854779507cafd5fe1f9a6, count: 8 }, 
    { tags: 578854779507cafd5fe1f9a5, count: 5 }, 
    { tags: 5788570d9507cafd5fe1f9b0, count: 2 } ] 

回答

4

在$小組賽階段,你需要指定一個_id。這是強制性的,並將按鍵組成。所以基本上你需要改變

{ 
    "$group": { 
     "tags": '$tags.tags', 
     "count": {"$sum": 1} 
    } 
} 

{ 
    "$group": { 
     "_id": '$tags', 
     "count": {"$sum": 1} 
    } 
} 

所以,完整的管道將是:

Guess.aggregate([ 
    { 
     "$project": { 
      "_id": 1, 
      "tags": 1 
     } 
    }, 
    { 
     "$unwind": "$tags" 
    } 
    , 
    { 
     "$group": { 
      "_id": '$tags', 
      "count": {"$sum": 1} 
     } 
    }, 
    {"$sort": {"count": -1}}, 
    {"$limit": 5} 
]);