代码之家  ›  专栏  ›  技术社区  ›  elevenmac

Pymongo聚合-传递用于聚合的python列表

  •  1
  • elevenmac  · 技术社区  · 6 年前

    如果查询中的所有元素都是硬编码的,那么我将尝试根据时间戳执行聚合(按天)。

    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集合,那么如何传递一个python\u列表,其中包含基于时间戳进行聚合的各个元素? 假设我的Python列表包含如下元素:

    key\u列表= animal.dog, animal.dog.tail, animal.cat, tree, fruits, timestamp .

    我想将此列表传递到我刚才编写的查询中,而不必对每个元素进行硬编码。我想表演 projection , $sum , $group 对于没有像我在前面的查询中那样硬编码的元素。我只想在 $project $组 阶段

    这可能吗?

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   chridam    6 年前

    您可以尝试以下操作:

    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]