Как получить сумму определенного поля коллекции в коллекции MongoDB с помощью PyMongo? - PullRequest
0 голосов
/ 27 декабря 2018

Моя 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?Я не могу сформировать запрос

1 Ответ

0 голосов
/ 09 января 2019

Ну, я делал довольно простые ошибки при преобразовании запроса в функцию агрегирования 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 и EndDate находятся в Python datetime format.

...