首页 > 解决方案 > 仅在 MongoDB 中返回匹配的属性

问题描述

我有以下数据结构。数据库包含多个实例,所有实例都具有相同的基本数据结构。

{
_id: ObjectId('5f4ceabe521de56d99738fd4'),
position: 11,
entropy: 0.4582005345072268,
supports: 61,
sequences: [
    {
        position: 11,
        sequence: 'CLVFAQKIP',
        count: 56,
        conservation: 91.80327868852459,
        motif_short: 'I',
        motif_long: 'Index',
        id: [
            'ASU55526.1',
            'ASU55528.1',
            'QBM69729.1',
            'QJR40421.1'
        ],
        strain: [
            'Influenza A virus A/Shandong-Zhifu/164/2016',
            'Influenza A virus A/Shandong-Zhifu/1185/2016',
            'Influenza A virus A/China/71517/2016',
            'Influenza A virus A/Jiangxi/2017lgfh0026/2016'
        ],
        country: [
            'HA Hemagglutinin',
            'HA Hemagglutinin',
            'HA Hemagglutinin',
            'HA Hemagglutinin'
        ],
        host: [
            'Influenza A virus A/Shandong-Zhifu/164/2016',
            'Influenza A virus A/Shandong-Zhifu/1185/2016',
            'Influenza A virus A/China/71517/2016',
            'Influenza A virus A/Jiangxi/2017lgfh0026/2016'
        ]
    },
    {
        position: 11,
        sequence: 'CLVFAQKLP',
        count: 4,
        conservation: 6.557377049180328,
        motif_short: 'Ma',
        motif_long: 'Major',
        id: [
            'APQ31289.1',
            'APQ31290.1',
            'QJR40413.1',
            'QJR40414.1'
        ],
        strain: [
            'Influenza A virus A/Xiamen/s200/2016',
            'Influenza A virus A/Xiamen/s175/2016',
            'Influenza A virus A/Jiangxi/2016lgfh1021/2016',
            'Influenza A virus A/Jiangxi/2017lgfh0045/2016'
        ],
        country: [
            'HA Hemagglutinin',
            'HA Hemagglutinin',
            'HA Hemagglutinin',
            'HA Hemagglutinin'
        ],
        host: [
            'Influenza A virus A/Xiamen/s200/2016',
            'Influenza A virus A/Xiamen/s175/2016',
            'Influenza A virus A/Jiangxi/2016lgfh1021/2016',
            'Influenza A virus A/Jiangxi/2017lgfh0045/2016'
        ]
    },
    {
        position: 11,
        sequence: 'CLDFAQKIP',
        count: 1,
        conservation: 1.639344262295082,
        motif_short: 'U',
        motif_long: 'Unique',
        id: [
            'APQ31291.1'
        ],
        strain: [
            'Influenza A virus A/Xiamen/s228/2016'
        ],
        country: [
            'HA Hemagglutinin'
        ],
        host: [
            'Influenza A virus A/Xiamen/s228/2016'
        ]
    }
],
variants: 3

}

我需要的是获取“motif_short”属性等于“I”的序列(不是整行或序列列表)。有时可能有两个或多个,但在这个特定的例子中,只有一个“I”序列。

我正在使用 Python (PyMongo),经过多次尝试,我只剩下一半的解决方案,而且头上没有头发。

db.document.find({'sequences.motif_short': {"$eq": 'I'}}, {'sequences': 1, '_id': 0})

这显然给了我匹配的整个“序列”属性,这不是我想要的。

我对 Mongo 比较陌生,所以我猜这是一个相当简单的问题。请帮帮我。

标签: pythonmongodbpymongo

解决方案


你可以用聚合来做到这一点(试试看

db.collection.aggregate([
  {
    "$unwind": "$sequences"
  },
  {
    "$match": {
      "sequences.motif_short": {
        "$eq": "I"
      }
    }
  },
  {
    "$project": {
      "sequences": 1,
      "_id": 0
    }
  }
])

,$unwind拆分多个文档中的序列列表

随着$match你申请你的条件:sequences.motif_short = "I"

并且使用$project,您只保留您想要的字段


这是使用聚合的示例pymongo


推荐阅读