python-3.x - 如何使用 PyMongo 获取 MongoDB 集合中集合的特定字段的总和?
问题描述
我的 MongoDB 包含以下数据
{
"_id" : ObjectId("5c1b742eb1829b69963029e8"),
"duration" : 12,
"cost" : 450,
"tax" : 81,
"tags" : [],
"participants" : [
ObjectId("5c1b6a8f348ddb15e4a8aac7"),
ObjectId("5c1b742eb1829b69963029e7")
],
"initiatorId" : ObjectId("5c1b6a8f348ddb15e4a8aac7"),
"context" : "coach",
"accountId" : ObjectId("5bdfe7b01cbf9460c9bb5d68"),
"status" : "over",
"webhook" : "http://d4bdc1ef.ngrok.io/api/v1/webhook_callback",
"hostId" : "5be002109a708109f862a03e",
"createdAt" : ISODate("2018-12-20T10:51:26.143Z"),
"updatedAt" : ISODate("2018-12-20T10:51:44.962Z"),
"__v" : 0,
"endedAt" : ISODate("2018-12-20T10:51:44.612Z"),
"startedAt" : ISODate("2018-12-20T10:51:32.992Z"),
"type" : "voip"
}
{
"_id" : ObjectId("5c1b7451b1829b69963029ea"),
"duration" : 1,
"cost" : 150,
"tax" : 27,
"tags" : [],
"participants" : [
ObjectId("5c1b6a8f348ddb15e4a8aac7"),
ObjectId("5c1b7451b1829b69963029e9")
],
"initiatorId" : ObjectId("5c1b6a8f348ddb15e4a8aac7"),
"context" : "coach",
"accountId" : ObjectId("5bdfe7b01cbf9460c9bb5d68"),
"status" : "over",
"webhook" : "http://d4bdc1ef.ngrok.io/api/v1/webhook_callback",
"hostId" : "5be002109a708109f862a03e",
"createdAt" : ISODate("2018-12-20T10:52:01.560Z"),
"updatedAt" : ISODate("2018-12-20T10:52:08.018Z"),
"__v" : 0,
"endedAt" : ISODate("2018-12-20T10:52:07.667Z"),
"startedAt" : ISODate("2018-12-20T10:52:06.762Z"),
"type" : "voip"
}
我想获取特定 accountID 的总持续时间(持续时间字段的总和),其中状态等于特定日期范围的“结束”。无论如何使用 PyMongo 来完成这个?我无法形成查询
解决方案
好吧,在将查询转换为 PyMongo 聚合函数时,我犯了一些非常基本的错误。我要说的是要小心查询结构格式,尤其是键要封装在quotes("")
. 为了解决这个问题,我要做的就是
from bson.objectid import ObjectId
pipe = [
{"$match": {"accountId": ObjectId(accountId),
"status": "over",
"startedAt": {"$gte": startDate,
"$lte": EndDate
}
}},
{"$project": {"readableDate":
{"$dateToString":
{"format": "%Y-%m-%d", "date": "$startedAt"}},
"accountId": str("$accountId"),
"duration": "$duration"
}},
{"$group": {"_id": {"date": "$readableDate",
"accountId": str("$accountId")}, "totalCallDuration": {"$sum": "$duration"}}}]
for doc in db.VoiceCall.aggregate(pipe):
print(doc)
只是提醒一下:startDate
andEndDate
在Python datetime format
。
推荐阅读
- java - 如何使 Apache Camel Kafka 组件与仅通过 zookeper 公开的代理一起工作
- javascript - 使用 IO 操作时如何不让任务过度饱和 libuv
- python - 事件时间线——设置注释位置
- laravel - 正确创建 Laravel 包
- lua - 请帮我解决错误 main.lua:50:尝试索引全局“硬币”(零值)
- javascript - JS:将 PHP 时间转换为 JS 日期
- ruby-on-rails - 迁移将各种不相关的模型列从 Integer 更改为 Bigint 类型
- arrays - 评估平面列表中的 item.item.name
- javascript - 将 m3u8 视频文件加载为具有不同来源的 Blob
- prisma - prisma/codemods 不转换 findUnique