2016-08-02 41 views
5

我的收藏看起來很喜歡這個。mongodb中的多個組

{ 
"_id" : ObjectId("572c4ed33c1b5f51215219a8"), 

"name" : "This is an angular course, and integeration with php", 
"description" : "After we connected we can query or update the database just how we would using the mongo API with the exception that we use a callback. The format for callbacks is always callback(error, value) where error is null if no exception has occured. The update methods save, remove, update and findAndModify also pass the lastErrorObject as the last argument to the callback function.", 
"difficulty_level" : "Beginner", 
"type" : "Fast Track", 
"tagged_skills" : [ 
    { 
     "_id" : "5714e894e09a0f7d804b2254", 
     "name" : "PHP" 
    }, 
    { 
     "_id" : "5717355806313b1f1715fa50", 
     "name" : "c++" 
    }, 
    { 
     "_id" : "5715025bc2c5dbb4675180da", 
     "name" : "java" 
    }, 
    { 
     "_id" : "5714f188ec325f5359979e33", 
     "name" : "symphony" 
    } 
]} 

我想根據類型,難度級別和標記技能的集合進行分組,並在單個查詢中獲得計數。

我無法添加技能數量。

我的查詢如下: -

db.course.aggregate([ 
{$unwind:"$tagged_skills"}, 
{$group:{ 
    _id:null, 
skills: { $addToSet: "$tagged_skills.name" }, 
Normal_df:{$sum:{ 
       "$cond": [ 
        { "$eq":[ "$difficulty_level","Normal"] }, 
        1, 
        0 
       ] 
      }}, 
Beginner_df:{$sum:{ 
       "$cond": [ 
        { "$eq":[ "$difficulty_level","Beginner"] }, 
        1, 
        0 
       ] 
      }}, 
Intermediate_df:{$sum:{ 
       "$cond": [ 
        { "$eq":[ "$difficulty_level","Intermediate"] }, 
        1, 
        0 
       ] 
      }}, 
Advanced_df:{$sum:{ 
       "$cond": [ 
        { "$eq":[ "$difficulty_level","Advanced"] }, 
        1, 
        0 
       ] 
      }}, 
Fast_Track_type:{$sum:{ 
       "$cond": [ 
        { "$eq":[ "$type","Fast Track"] }, 
        1, 
        0 
       ] 
      }}, 
Normal_type:{$sum:{ 
       "$cond": [ 
        { "$eq":[ "$type","Normal"] }, 
        1, 
        0 
       ] 
      }}, 
Beginner_type:{$sum:{ 
       "$cond": [ 
        { "$eq":[ "$type","Beginner"] }, 
        1, 
        0 
       ] 
      }}, 
Normal_Track_type:{$sum:{ 
       "$cond": [ 
        { "$eq":[ "$type","Normal Track"] }, 
        1, 
        0 
       ] 
      }}, 
    }} 
]) 

結果如下: -

{ 
    "_id" : null, 

    "skills" : [ 
     "SQL", 
     "PHP", 
     "java", 
     "Angular Js", 
     "Laravel 23", 
     "c++", 
     "Node Js", 
     "symphony", 
     "Mysql", 
     "Express Js", 
     "JAVA" 
    ], 
    "Normal_df" : 1, 
    "Beginner_df" : 14, 
    "Intermediate_df" : 7, 
    "Advanced_df" : 2, 
    "Fast_Track_type" : 8, 
    "Normal_type" : 6, 
    "Beginner_type" : 1, 
    "Normal_Track_type" : 9 
} 

我也想獲得的所有技能,他們的數量。

回答

2

要獲得所有技能與他們的數量,你需要先獲得所有技能的列表。您可以通過在批准的字段上運行distinct命令來獲取此列表。有了這個列表,您可以再構造將使用$sum$cond運營商相應的$group管道文件。

考慮以下用例:

var difficultyLevels = db.course.distinct("difficulty_level"), 
    types = db.course.distinct("type"), 
    skills = db.course.distinct("tagged_skills.name"), 
    unwindOperator = { "$unwind": "$tagged_skills" }, 
    groupOperator = { 
     "$group": { 
      "_id": null, 
      "skills": { "$addToSet": "$tagged_skills.name" } 
     }  
    }; 

difficultyLevels.forEach(function (df){ 
    groupOperator["$group"][df+"_df"] = { 
     "$sum": { 
      "$cond": [ { "$eq": ["$difficulty_level", df] }, 1, 0] 
     } 
    } 
}); 

types.forEach(function (type){ 
    groupOperator["$group"][type.replace(" ", "_")+"_type"] = { 
     "$sum": { 
      "$cond": [ { "$eq": ["$type", type] }, 1, 0] 
     } 
    } 
}); 

skills.forEach(function (skill){ 
    groupOperator["$group"][skill] = { 
     "$sum": { 
      "$cond": [ { "$eq": ["$tagged_skills.name", skill] }, 1, 0] 
     } 
    } 
}); 

//printjson(groupOperator); 
db.course.aggregate([unwindOperator, groupOperator]); 

在第一行中,我們通過在difficulty_level字段運行distinct命令獲得與難度水平的陣列

db.course.distinct("difficulty_level") 

這將產生陣列

var difficultyLevels = ["Normal", "Beginner", "Intermediate", "Advanced"] 

同樣,前面的distinct操作將返回該密鑰的可能唯一值列表。

獲取這些列表後,您可以使用方法創建管道對象,以填充列表中每個給定項目的文檔關鍵字。然後你可以使用生成的文件,看起來像這樣

printjson(groupOperator); 
{ 
    "$group" : { 
     "_id" : null, 
     "skills" : { 
      "$addToSet" : "$tagged_skills.name" 
     }, 
     "Beginner_df" : { 
      "$sum" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$difficulty_level", 
          "Beginner" 
         ] 
        }, 
        1, 
        0 
       ] 
      } 
     }, 
     "Intermediate_df" : { 
      "$sum" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$difficulty_level", 
          "Intermediate" 
         ] 
        }, 
        1, 
        0 
       ] 
      } 
     }, 
     "Fast_Track_type" : { 
      "$sum" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$type", 
          "Fast Track" 
         ] 
        }, 
        1, 
        0 
       ] 
      } 
     }, 
     "PHP" : { 
      "$sum" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$tagged_skills.name", 
          "PHP" 
         ] 
        }, 
        1, 
        0 
       ] 
      } 
     }, 
     "c++" : { 
      "$sum" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$tagged_skills.name", 
          "c++" 
         ] 
        }, 
        1, 
        0 
       ] 
      } 
     }, 
     "java" : { 
      "$sum" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$tagged_skills.name", 
          "java" 
         ] 
        }, 
        1, 
        0 
       ] 
      } 
     }, 
     "symphony" : { 
      "$sum" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$tagged_skills.name", 
          "symphony" 
         ] 
        }, 
        1, 
        0 
       ] 
      } 
     }, 
     "C#" : { 
      "$sum" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$tagged_skills.name", 
          "C#" 
         ] 
        }, 
        1, 
        0 
       ] 
      } 
     }, 
     "Scala" : { 
      "$sum" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$tagged_skills.name", 
          "Scala" 
         ] 
        }, 
        1, 
        0 
       ] 
      } 
     }, 
     "javascript" : { 
      "$sum" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$tagged_skills.name", 
          "javascript" 
         ] 
        }, 
        1, 
        0 
       ] 
      } 
     } 
    } 
} 
+1

感謝它的工作正常。 –