mongodb-是否可以在查找查询中的$ elemMatch投影之后进行过滤?

时间:2019-02-04 09:22:17

标签: mongodb

我在名为“变体”的集合中有这样的文档:

{
    "_id" : "An_FM000900_Var_10_100042505_100042505_G_A",
    "analysisId" : "FM000900",
    "chromosome" : 10,
    "start" : 100042505,
    "end" : 100042505,
    "size" : 1,
    "reference" : "G",
    "alternative" : "A",
    "effects" : [ 
        {
            "_id" : "Analysis:FM000900-Variant:An_FM000900_Var_10_100042505_100042505_G_A-Effect:0",

            "biotype" : "protein_coding",
            "impact" : "LOW",
        },
        {
            "_id" : "Analysis:FM000900-Variant:An_FM000900_Var_10_100042505_100042505_G_A-Effect:1",

            "biotype" : "protein_coding",
            "impact" : "MODERATE",
        }
    ]
}

我想在该集合中找到符合某些条件(“ analysisId”:“ FM000900”)的文档,然后我要在“效果”数组字段上投影以仅在“效果”数组中引入第一个元素符合某些标准(“生物型”:“蛋白质编码”和“影响”:“中等”)。

问题是,仅当“效果”数组中的至少一个元素满足条件时,我才想显示主要的“变体”文档。

通过以下查询,我得到了预期的结果,除了我得到的“变量”文档的“效果”数组字段为空。

db.getCollection('variants').find(  
{
     "analysisId":"FM000900"
}
,
{ 
    "effects":{
        "$elemMatch" : {
            "biotype" : "protein_coding",
            "impact" : "MODERATE"
        }
    }
}     
).skip(0).limit(200)

如果可能的话,有人可以将查询转换为仅在投影后的“效果”数组中包含某些元素的“变体”文档吗?

是否可以通过其他方式完成,如果可能的话,不使用聚合框架?因为该馆藏有数百万份文档,因此必须具有高性能。

非常感谢大家!

1 个答案:

答案 0 :(得分:1)

除投影外,仅使用$elemMatch as query operator,它将过滤至少具有一个符合所有条件的effect数组元素的变量。 因此,您的查询将是:

db.getCollection('variants').find(  
{
     "analysisId":"FM000900",
     "effects":{
        "$elemMatch" : {
            "biotype" : "protein_coding",
            "impact" : "MODERATE"
        }
    }
}
,
{ 
    "effects":{
        "$elemMatch" : {
            "biotype" : "protein_coding",
            "impact" : "MODERATE"
        }
    }
}     
).skip(0).limit(200)

此外,同时涵盖查询和投影的compound multikey index可以提高阅读性能,但请谨慎使用,因为它会大大降低书写性能。