2016-08-26 10 views
6

私はこのmongodb(マングース)問題を解決するのが難しいです。

スキーマ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") 
    ] 
} 
...... 
..... 

私は最も人気のあるタグ(タグ)のリストを取得する必要があります。上記の私は、あなたにスキーマと私のソリューションのmongooseクエリを示します。

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最も人気のあるタグを表示します。それを修正するには?

私が望む結果では、_idを指定する必要があなたの$のグループステージで

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

答えて

4

のように見えます。それは必須であり、キーでグループになります。だから、基本的にあなたが

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

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

を変更する必要があるので、完全なパイプラインは次のようになります。

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