mongodb - 编写复杂查询,包括嵌入式数组中的排序

时间:2018-02-23 08:49:15

标签: arrays mongodb

我有一个包含这样文件的集合:

{
"_id" : ObjectId("5a8ec4620cd3c2a4062548ec"),
"chromosome" : 1,
"start" : "1",
"reference" : "A",
"alternative" : "C",
"populationFrequencies" : [ 
    {
        "study" : "dbnlvar",
        "population" : "GBL",
        "value" : 0.1
    }, 
    {
        "study" : "genomad",
        "population" : "AF",
        "value" : 0.2
    }, 
    {
        "study" : "genomad",
        "population" : "AFR",
        "value" : 0.3
    }, 
    {
        "study" : "genomad",
        "population" : "AMR",
        "value" : 0.4
    }, 
    {
        "study" : "genomad",
        "population" : "ASJ",
        "value" : 0.2
    }
    {
        "study" : "1kg",
        "population" : "GBL",
        "value" : 0.1
    }, 
    {
        "study" : "1kg",
        "population" : "EUR",
        "value" : 0.15
    }, 
    {
        "study" : "1kg",
        "population" : "SAS",
        "value" : 0.10
    }, 
    {
        "study" : "1kg",
        "population" : "AMR",
        "value" : 0.25
    }, 
    {
        "study" : "1kg",
        "population" : "EAS",
        "value" : 0.7
    }
]
} 

使用此标准:

  1. 学习等于'1kg'
  2. 人口在[EUR,SAS,AMR]
  3. 我想在集合中找到满足条件的文件,这些文件在populationFrecuencies数组中排序,符合条件1和2,字段'value'从最低到最高,第二个最低值大于0.10

    因此,为了澄清,在以下示例中,将显示该文档。

    • 研究1kg - 人口SAS - 值0.10
    • 研究1kg - 人口EUR-值0.15 <---大于0.10
    • 研究1kg - 人口AMR - 值0.25

    是否可以在mongodb shell中表示为查询? 谁能帮我? 非常感谢你的时间。

1 个答案:

答案 0 :(得分:0)

使用Aggregation Framework我们可以获得所需的结果

db.collection_name.aggregate([
   {$unwind:"$populationFrequencies"},
   {$match:
      {$and:[
         {"populationFrequencies.study":"1kg"}, 
         {"populationFrequencies.population":
            {$in:["EUR", "SAS", "AMR"]}
         }
      ]}
    },
    {$sort:{"populationFrequencies.value":1}}
])

首先使用$unwind打破populationFrequencies文档数组

然后使用$match,在我们的场景中,我们需要使用$和$in来满足条件

1. Study is equal to '1kg'
2. Population is in [EUR,SAS,AMR]

最后使用$sort

上述文件的样本输出将是

{
        "_id" : ObjectId("5a8ec4620cd3c2a4062548ec"),
        "chromosome" : 1,
        "start" : "1",
        "reference" : "A",
        "alternative" : "C",
        "populationFrequencies" : {
                "study" : "1kg",
                "population" : "SAS",
                "value" : 0.1
        }
}
{
        "_id" : ObjectId("5a8ec4620cd3c2a4062548ec"),
        "chromosome" : 1,
        "start" : "1",
        "reference" : "A",
        "alternative" : "C",
        "populationFrequencies" : {
                "study" : "1kg",
                "population" : "EUR",
                "value" : 0.15
        }
}
{
        "_id" : ObjectId("5a8ec4620cd3c2a4062548ec"),
        "chromosome" : 1,
        "start" : "1",
        "reference" : "A",
        "alternative" : "C",
        "populationFrequencies" : {
                "study" : "1kg",
                "population" : "AMR",
                "value" : 0.25
        }
}