MongoDB$数组项的总和
我给MongoDB一个机会,用MongoDB和PYTHON构建一个简单的日志。我有一个简单的结构:MongoDB$数组项的总和,mongodb,python-2.7,pymongo,Mongodb,Python 2.7,Pymongo,我给MongoDB一个机会,用MongoDB和PYTHON构建一个简单的日志。我有一个简单的结构: 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}], "
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上正确分组,但没有$sum workout.time
有人能帮我吗
谢谢请注意,
训练
字段是文档列表。您的错误是将此字段视为子文档。您将能够通过更改数据模型来解决问题,并保持聚合不变。因此,请尝试以下模型:
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"
}
编辑:
好吧,但是如果我一天有多个锻炼呢
说得好。假设我上面的答案以一种糟糕的方式解决了这个问题,因为我增加了每天只锻炼一次的限制。让我们回到你的模型,在这个模型中不存在这种限制无论如何我都需要修改它,以便使列表中的所有项目都相等
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"
}
对于此示例,您可以将其用作聚合管道中的一个步骤:
db.posts.aggregate([{$unwind:{"$workout"}},{$group:{_id:"$workout.type", count:{$sum:"$workout.time"}}}])
我还没有测试过,但我希望它能工作
关于好的,我现在明白了,我的数据模型有一点错误。感谢您展示如何使用$unwind ist,它现在似乎正在工作。