2016-03-31 19 views
1

MongoDBとPYTHONを使ってMongoDBにショットを作成し、簡単なジャーナルを作成しています。私はこのシンプルな構造を持っています:

db.posts.findOne() 
{ 
"waketime": ISODate("2016-03-18T11:20:00Z"), 
"bedtime": ISODate("2016-03-18T22:00:00Z"), 
"day": "day entry", 
"dream": "dream entry", 
"workout" : [{"type":"cardio"},{"time":45}], 
"meditation" : [{"time":10},{"time":10}], 
"sex": "none" 
} 

私は仕事をしている時間と私は運動の種類ごとに取り組んだ時間を取得しようとしています。最後に、私はこれを得ている:

cursor = db.posts.aggregate([ 
    {"$group": {"_id" : "$workout.type", "count": {"$sum": "$workout.time"}}} 
]) 

が、それはこの返します

{u'count': 0, u'_id': [u'cardio']} 
{u'count': 0, u'_id': [u'strength']} 

workout.type上で正しくグループ化しているようだが、それは$和workout.timeをしません

誰も私を助けることができますか?

はフィールドworkoutは、文書のリストであることをあなたに

答えて

1

注意を感謝します。あなたのエラーは、このフィールドをサブ文書として扱っているということです。データモデルを変更して問題を解決し、集計をそのまま保つことができます。だから、代わりに次のようなモデルを試してみてください。

db.posts.findOne() 
{ 
"waketime": ISODate("2016-03-18T11:20:00Z"), 
"bedtime": ISODate("2016-03-18T22:00:00Z"), 
"day": "day entry", 
"dream": "dream entry", 
"workout" : { 
    "type":"cardio", 
    "time":45 
}, 
"meditation" : { 
    "type":"dunno", 
    "time":10 
}, 
"sex": "none" 
} 

EDIT:

大丈夫しかし、私は一日、複数のトレーニングを持っている場合は?

良い点。上記の私の答えは、1日に1回しか運動をしないという制限を加えているので、悪い方法で問題を解決するとしましょう。この制限が存在しないモデルのようなものに戻りましょう。

db.posts.aggregate([{$unwind:{"$workout"}},{$group:{_id:"$workout.type", count:{$sum:"$workout.time"}}}]) 
私はあなたが集約パイプラインのステップの1つとして$unwindを使用することができます。この例

db.posts.findOne() 
{ 
"waketime": ISODate("2016-03-18T11:20:00Z"), 
"bedtime": ISODate("2016-03-18T22:00:00Z"), 
"day": "day entry", 
"dream": "dream entry", 
"workout" : [{"type":"cardio", "time":45},{"type": "strength", "time":45}], 
"meditation" : [{"time":10},{"time":10}], 
"sex": "none" 
} 

同等のリストにすべてのアイテムを作るためにとにかくそれを修正するために必要なてきました

私はそれをテストしていませんが、私はそれが動作することを願っています。

よろしくお願いいたします。

+1

大丈夫ですが、1日に複数のトレーニングをしているとどうなりますか? –

+1

大丈夫私のデータモデルには少し誤りがありました。 $ unwind istの使い方を教えてくれてありがとうございます。 –