我在名为“变体”的集合中有这样的文档:
{
"_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)
如果可能的话,有人可以将查询转换为仅在投影后的“效果”数组中包含某些元素的“变体”文档吗?
是否可以通过其他方式完成,如果可能的话,不使用聚合框架?因为该馆藏有数百万份文档,因此必须具有高性能。
非常感谢大家!
答案 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可以提高阅读性能,但请谨慎使用,因为它会大大降低书写性能。