如何查询嵌套的异构文档

时间:2019-09-20 19:10:37

标签: mongodb

我有一个具有以下格式的数组:

data{
  [sequentialId]{guid:value1,name:value2}
}

我需要做类似db.data.find(“ data。?。name”:“ value1”)

我见过的所有解决方案都行不通,因为他们希望我知道属性的名称,但是在这种情况下,ID是连续的。

我已经研究了查询此处描述的嵌套文档的标准方法 https://docs.mongodb.com/manual/tutorial/query-array-of-documents/ 我还查看了$ unwind之类的一些选项,但是我什么也无法工作

这是一个小样本

{"41":{"b":453081600,"f":1,"h":171,"s":4,"w":4,"wr":[2,0]},
"80":{"b":337132800,"f":2,"h":169,"s":4,"w":4,"wr":[0,0]},
"388":{"b":148694400,"f":1,"h":188,"l":{"c":[{"e":2001,"g":13,"m":292,"s":1992,"t":18},{"e":2006,"g":11,"m":197,"s":2001,"t":1},{"e":2009,"g":2,"m":111,"s":2006,"t":1790},{"e":2009,"g":0,"m":1,"s":2009,"t":1937},{"e":2010,"g":1,"m":14,"s":2010,"t":1},{"e":2011,"g":0,"m":8,"s":2010,"t":13}],"n":[{"e":2007,"g":1,"m":73,"s":1996,"t":1318}]},"s":2,"w":3,"wr":[0,0]}}

例如在这组数据中,我可能需要查询“ f” = 1

的所有文档

1 个答案:

答案 0 :(得分:0)

以下查询可以为我们提供预期的输出:

注意::我们正在提取name等于a

的文档
db.collection.aggregate([
  {
    $addFields:{
      "filtered":{
        $filter:{
          "input":"$data",
          "as":"info",
          "cond":{
            $let:{
              "vars":{
                "array":{
                  $objectToArray:"$$info"
                }
              },
              "in":{
                $in:["a","$$array.v.name"]
              }
            }

          }
        }
      }
    }
  },
  {
    $match:{
      "filtered.0":{
        $exists:true
      }
    }
  },
  {
    $project:{
      "filtered":0
    }
  }
]).pretty()

数据集:

{
  "data":[
    {
      "41": {
        "b": 453081600,
        "name": "a"
      },
      "80": {
        "b": 337132800,
        "name": "b"
      },
      "388": {
        "b": 148694400,
        "name": "c"
      }
    }
  ]
}
{
  "data":[
    {
      "41": {
        "b": 453081600,
        "name": "b"
      },
      "80": {
        "b": 337132800,
        "name": "b"
      },
      "388": {
        "b": 148694400,
        "name": "c"
      }
    }
  ]
}

输出:

{
  "data":[
    {
      "41": {
        "b": 453081600,
        "name": "a"
      },
      "80": {
        "b": 337132800,
        "name": "b"
      },
      "388": {
        "b": 148694400,
        "name": "c"
      }
    }
  ]
}

查询分析:

  • 我们正在创建一个过滤的数组,以仅保存data数组中的那些记录,该记录包含name等于a的任何带有未知键的子文档中的记录。
  • 首先要将data的每个文档转换为键值对数组。现在,我们可以直接查询值,而不必担心键。
  • 最后,过滤filtered数组的大小大于零的那些文档。