#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"
]
}
]
}