Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays mongodb-在嵌入式数组中编写包含排序的复杂查询_Arrays_Mongodb - Fatal编程技术网

Arrays mongodb-在嵌入式数组中编写包含排序的复杂查询

Arrays mongodb-在嵌入式数组中编写包含排序的复杂查询,arrays,mongodb,Arrays,Mongodb,我收集了如下文件: { "_id" : ObjectId("5a8ec4620cd3c2a4062548ec"), "chromosome" : 1, "start" : "1", "reference" : "A", "alternative" : "C", "populationFrequencies" : [ { "study" : "dbnlvar", "population" : "GBL", "value" : 0.1

我收集了如下文件:

{
"_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公斤”
  • 人口单位为[欧元、SAS、AMR]
  • 我想找出集合中满足以下条件的文档:在满足条件1和2的PopulationFrequencies数组中按字段“值”从低到高排序文档,第二个最低值大于0.10

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

    • 研究1kg-人群SAS-值0.10
    • 研究1kg-人口EUR-值0.15使用我们可以得到预期的结果

      db.collection_name.aggregate([
         {$unwind:"$populationFrequencies"},
         {$match:
            {$and:[
               {"populationFrequencies.study":"1kg"}, 
               {"populationFrequencies.population":
                  {$in:["EUR", "SAS", "AMR"]}
               }
            ]}
          },
          {$sort:{"populationFrequencies.value":1}}
      ])
      
      首先,使用break键,打开文档的
      填充频率
      数组

      然后使用,在我们的场景中,我们需要使用$and来满足标准的要求

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

      上述文件上的样本输出将

      {
              "_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
              }
      }
      

      您可以在3.6中尝试下面的聚合

      db.col.aggregate([
        {"$match":{
          "populationFrequencies":{
            "$elemMatch":{
              "study":"1kg","population":{"$in":["EUR","SAS","AMR"]}
            }
          }
        }},
        {"$unwind":"$populationFrequencies"},
        {"$sort":{"populationFrequencies.value":1}},
        {"$group":{"_id":"$_id","populationFrequencies":{"$push":"$populationFrequencies"}}},
        {"$match":{"$expr":{"$gt":[{"$arrayElemAt":["$populationFrequencies.value",1]},0.10]}}}
      ])
      

      使用aggregation Framework k可以很容易地完成,这样我就可以对数组进行排序,但是检查第二项的值是否大于0.10,以确定查询是否应该返回文档?在$match部分的$and中添加所需的条件。我不确定我是否解释得很好,在订购之后,我必须检查订购的第二项的值是否大于0.10。除此之外,我是否应该在展开操作中聚合拆分的项目,以再次形成单个文档?是的,我必须对您的聚合进行一些更改,因为我使用的是mongo 3.4,但这肯定是我正在寻找的解决方案。谢谢Veeram。