【问题标题】:Pymongo aggregation - passing python list for aggregationPymongo 聚合 - 传递 python 列表进行聚合
【发布时间】:2018-01-09 12:33:40
【问题描述】:

如果所有元素都在查询中硬编码,那么这是我基于时间戳执行聚合(按天计算)的尝试。

pipe = [ 
{
     "$match": { 
        "cid": ObjectId("57fe39972b8dbc1387b20913")
        }
    },
{
    "$project":
    {

        "animal_dog": "$animal.dog",
        "animal_dog_tail": "$animal.dog.tail",
        "animal_cat": "$animal.cat",
        "tree": "$fruits",
        "day": {"$substr": ["$timestamp",  0, 10]} 
        }},
{ 
"$group":
    {
    "_id" : "$day",
    "animal_dog" : {"$sum": "$animal_dog"},
    "animal_dog_tail": {"$sum": "$animal_dog_tail"}, 
    "animal_cat": {"$sum": "$animal_cat"}, 
    "tree": {"$sum": "$tree"}, 
    "fruits": {"$sum": "$fruits"},

}} ]

output = dailycollection.aggregate(pipeline = pipe)

假设我有一个具有完全相同嵌套结构的 mongo-collection,我如何传递一个带有相应元素的 python_list 以根据时间戳进行聚合? 假设我的 Python 列表有这样的元素:

key_list = animal.dog, animal.dog.tail, animal.cat, tree, fruits, timestamp.

我想将此列表传递到我刚刚在上面编写的查询中,而不对每个元素进行硬编码。我想对元素执行projection$sum$group,而不像在上述查询中那样对它们进行硬编码。我想在$project$group 阶段简单地遍历python 列表。

这可能吗?

还有我如何确保输出查询也保留相同的嵌套格式而不会丢失深度?

【问题讨论】:

    标签: python mongodb aggregation-framework pymongo


    【解决方案1】:

    您可以尝试以下方法:

    key_list =  ["animal.dog", "animal.dog.tail", "animal.cat", "tree", "fruits", "timestamp"]
    match = { "$match": { "cid": ObjectId("57fe39972b8dbc1387b20913") } }
    project = { "$project": {} }
    group = { "$group": {} }
    
    for item in key_list:
        if item == "timestamp":
            project["$project"]["day"] = { "$substr": ["$"+item,  0, 10] }
            group["$group"]["_id"] = "$day"
            break
        sum = {"$sum": ""}
        sum["$sum"] = "$"+item.replace(".", "_")
        project["$project"][item.replace(".", "_")] = "$"+item
        group["$group"][item.replace(".", "_")] = sum
    
    pipeline = [match, project, group]
    

    【讨论】:

    • 谢谢@chridam。我运行了这段代码,我收到了这个错误pymongo.errors.OperationFailure: exception: invalid operator '$sum' - 我无法升级 Mongo-server,你能帮忙吗?
    • 我的 mongo-shell 版本是 3.0.12。
    • 当你print(pipeline)你得到什么?
    • 谢谢伙计,这是我的错,有一个额外的 _id 字段导致了错误。
    • 另外关于查询的输出,如何确保输出是嵌套格式?既然我们有点表示法,我们如何自动为结果输出查询添加嵌套的花括号?
    猜你喜欢
    • 2020-12-26
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多