Проверка критериев в глубоком вложенном списке

#python #mongodb #pymongo

#python #mongodb #pymongo

Вопрос:

Я использую MongoDB и PyMongo и имею приведенную ниже структуру данных.

 [
    {
        "position": 367,
        "entropy": 0.1327801096975522,
        "variants_flattened": [
            "GFRHQNSEG",
            "GFRHQNSEG",
            "GFRHQNSEG",
            "GFRHQNAEG"
        ],
        "supports": 51,
        "sequences": [
            {
                "position": 367,
                "sequence": "GFRHQNSEG",
                "count": 50,
                "conservation": 98.03921568627452,
                "motif_short": "I",
                "motif_long": "Index",
                "id": [
                    "APQ31289.1",
                    "ASU55526.1",
                    "ASU55528.1",
                    "APQ31291.1"
                ],
                "strain": [
                    "Influenza A virus A/Xiamen/s200/2016",
                    "Influenza A virus A/Shandong-Zhifu/164/2016",
                    "Influenza A virus A/Shandong-Zhifu/1185/2016",
                    "Influenza A virus A/Xiamen/s228/2016"
                ],
                "country": [
                    "HA Hemagglutinin",
                    "HA Hemagglutinin",
                    "HA Hemagglutinin",
                    "HA Hemagglutinin"
                ],
                "host": [
                    "Influenza A virus A/Xiamen/s200/2016",
                    "Influenza A virus A/Shandong-Zhifu/164/2016",
                    "Influenza A virus A/Shandong-Zhifu/1185/2016",
                    "Influenza A virus A/Xiamen/s228/2016"
                ]
            },
            {
                "position": 367,
                "sequence": "GFRHQNAEG",
                "count": 1,
                "conservation": 1.9607843137254902,
                "motif_short": "Ma",
                "motif_long": "Major",
                "id": [
                    "QBM69728.1"
                ],
                "strain": [
                    "Influenza A virus A/China/70793/2016"
                ],
                "country": [
                    "HA Hemagglutinin"
                ],
                "host": [
                    "Influenza A virus A/China/70793/2016"
                ]
            }
        ],
        "variants": 2
    }
]
  

Список корневого уровня содержит несколько объектов схожей структуры.

Что мне нужно, так это получить экземпляры (только конкретный объект из списка «последовательности»), где «motif_short» равно «I».

Ожидаемый результат (в данном конкретном примере существует только один выходной объект, но в одном экземпляре может быть несколько объектов, соответствующих этим критериям):

 {
                "position": 367,
                "sequence": "GFRHQNSEG",
                "count": 50,
                "conservation": 98.03921568627452,
                "motif_short": "I",
                "motif_long": "Index",
                "id": [
                    "APQ31289.1",
                    "ASU55526.1",
                    "ASU55528.1",
                    "APQ31291.1"
                ],
                "strain": [
                    "Influenza A virus A/Xiamen/s200/2016",
                    "Influenza A virus A/Shandong-Zhifu/164/2016",
                    "Influenza A virus A/Shandong-Zhifu/1185/2016",
                    "Influenza A virus A/Xiamen/s228/2016"
                ],
                "country": [
                    "HA Hemagglutinin",
                    "HA Hemagglutinin",
                    "HA Hemagglutinin",
                    "HA Hemagglutinin"
                ],
                "host": [
                    "Influenza A virus A/Xiamen/s200/2016",
                    "Influenza A virus A/Shandong-Zhifu/164/2016",
                    "Influenza A virus A/Shandong-Zhifu/1185/2016",
                    "Influenza A virus A/Xiamen/s228/2016"
                ]
}
  

Я совсем новичок в MongoDB и попробовал несколько вариантов, таких как Aggregate, но я прав, с чего начал. Пожалуйста, помогите мне.

Заранее спасибо!

Комментарии:

1. Не могли бы вы также добавить требуемый точный вывод?

Ответ №1:

Вы можете решить эту проблему с помощью aggregate $project и $filter . Пожалуйста, попробуйте следующий скрипт для этой конкретной проблемы:

 #if col is our collection object in pymongo

result = col.aggregate([{'$project': {'sequences': { '$filter': { 'input': '$sequences', 'as': 's', 'cond': { '$eq': ['$$s.motif_short', 'I'] } } } }}])
  

Этот запрос проецируется на последовательности и фильтры в motif_short равно «I». В результате вы получите что-то вроде этого:

 {
  "_id":"xyz",
  "sequences":[
    {
      "position":367,
      "sequence":"GFRHQNSEG",
      "count":50,
      "conservation":98.03921568627452,
      "motif_short":"I",
      "motif_long":"Index",
      "id":[
        "APQ31289.1",
        "ASU55526.1",
        "ASU55528.1",
        "APQ31291.1"
      ],
      "strain":[
        "Influenza A virus A/Xiamen/s200/2016",
        "Influenza A virus A/Shandong-Zhifu/164/2016",
        "Influenza A virus A/Shandong-Zhifu/1185/2016",
        "Influenza A virus A/Xiamen/s228/2016"
      ],
      "country":[
        "HA Hemagglutinin",
        "HA Hemagglutinin",
        "HA Hemagglutinin",
        "HA Hemagglutinin"
      ],
      "host":[
        "Influenza A virus A/Xiamen/s200/2016",
        "Influenza A virus A/Shandong-Zhifu/164/2016",
        "Influenza A virus A/Shandong-Zhifu/1185/2016",
        "Influenza A virus A/Xiamen/s228/2016"
      ]
    }
  ]
}