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

mongodb-是否可以在查找查询中的$elemMatch投影后进行筛选?,mongodb,Mongodb,我在一个名为“变体”的集合中有这样的文档: { "_id" : "An_FM000900_Var_10_100042505_100042505_G_A", "analysisId" : "FM000900", "chromosome" : 10, "start" : 100042505, "end" : 100042505, "size" : 1, "reference" : "G", "alternative" : "A",

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

{
    "_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”),然后我想在“effects”数组字段上进行投影,以便在“effects”数组中只引入符合某些标准的第一个元素(“biotype”:“protein_coding”和“impact”:“mediate”)

问题是,我只想在“effects”数组中至少有一个元素满足条件的情况下显示主“variant”文档

通过下面的查询,我得到了预期的结果,但得到的“variant”文档的“effects”数组字段为空

db.getCollection('variants').find(  
{
     "analysisId":"FM000900"
}
,
{ 
    "effects":{
        "$elemMatch" : {
            "biotype" : "protein_coding",
            "impact" : "MODERATE"
        }
    }
}     
).skip(0).limit(200)
如果可能的话,是否有人可以将此查询转换为仅获取投影后“effect”数组中包含某些元素的“variant”文档

如果可能的话,可以不使用聚合框架,用另一种方式完成吗?因为该收藏有数百万份文档,必须执行

非常感谢,伙计们

只需在投影之外使用,它将过滤至少具有一个匹配所有条件的效果数组元素的变体。 因此,您的查询将是:

db.getCollection('variants').find(  
{
     "analysisId":"FM000900",
     "effects":{
        "$elemMatch" : {
            "biotype" : "protein_coding",
            "impact" : "MODERATE"
        }
    }
}
,
{ 
    "effects":{
        "$elemMatch" : {
            "biotype" : "protein_coding",
            "impact" : "MODERATE"
        }
    }
}     
).skip(0).limit(200)
此外,包含查询和投影的方法可以提高阅读性能,但要小心使用,因为它会大大降低写作性能

只需在投影之外使用,它将过滤至少具有一个匹配所有条件的效果数组元素的变体。 因此,您的查询将是:

db.getCollection('variants').find(  
{
     "analysisId":"FM000900",
     "effects":{
        "$elemMatch" : {
            "biotype" : "protein_coding",
            "impact" : "MODERATE"
        }
    }
}
,
{ 
    "effects":{
        "$elemMatch" : {
            "biotype" : "protein_coding",
            "impact" : "MODERATE"
        }
    }
}     
).skip(0).limit(200)
此外,包含查询和投影的方法可以提高阅读性能,但要小心使用,因为它会大大降低写作性能