通过嵌入对象数组中的值对JSON文档进行排序

时间:2019-07-25 07:06:32

标签: python-3.x mongodb aggregation-framework pymongo

我有以下格式的文档。目的是按学生姓名对文档进行分组,并按升序对文档进行排序。一旦完成,就遍历等级(在一个学生内),如果每个随后的等级都大于前一个等级,则需要增加版本字段。作为管道的一部分,student_name将传递给我,因此按学生姓名进行匹配应该是不错的选择,而不是分组。

注意:在python上进行了尝试,并且在某种程度上可以工作。 python解决方案也很棒!

    {
        "_id" : ObjectId("5d389c7907bf860f5cd11220"),
        "class" : "I",
        "students" : [
            {
                "student_name" : "AAA",
                "Version" : 2,
                "scores" : [
                    {
                        "value" : "50",
                        "rank" : 2
                    },
                    {
                        "value" : "70",
                        "rank" : 1
                    }
                ]
            },
            {
                "student_name" : "BBB",
                "Version" : 5,
                "scores" : [
                    {
                        "value" : 80,
                        "rank" : 2
                    },
                    {
                        "value" : 100,
                        "rank" : 1
                    },
                    {
                        "value" : 100,
                        "rank" : 1
                    }
                ]
            }
        ]
    }

我尝试了这段代码进行排序

    def version(student_name):
        db.column.aggregate(
            [
           {"$unwind": "$students"},
           {"$unwind": "$students.scores"},
           {"$sort" : {"students.scores.rank" : 1}},
           {"$group" : {"students.student_name}
            ]
       )

for i in range(0,(len(students.scores)-1)):
    if students.scores[i].rank < students.scores[i+1].rank:
       tag.update_many(
           {"$inc" : {"students.Version":1}}
       )

学生AAA的预期输出应为

    {
        "_id" : ObjectId("5d389c7907bf860f5cd11220"),
        "class" : "I",
        "students" : [
            {
                "student_name" : "AAA",
                "Version" : 3, #version incremented
                "scores" : [
                    {
                        "value" : "70",
                        "rank" : 1
                    },
                    {
                        "value" : "50",
                        "rank" : 2
                    }
                ]
            }

1 个答案:

答案 0 :(得分:0)

我能够对文档进行排序。

 pipeline = [
            {"$unwind": "$properties"},
            {"$unwind": "$properties.values"},
            {"$sort" : {"$properties.values.rank" : -1}},
            {"$group": {"_id" : "$properties.property_name", "values" : {"$push" : "$properties.values"}}}
        ]

import pprint
pprint.pprint(list(db.column.aggregate(pipeline)))