如何在数组中查找被对象包围的特定元素?

时间:2018-06-19 09:46:41

标签: mongodb mongodb-query

这是我在MongoDB中的文档内容。它有一个对象时间戳和很多数组。

{
   "timestamps":{
      "1200":[
         "390.288",
         "390.818",
         "So"
      ],
      "1175":[
         "381.778",
         "382.248",
         "so"
      ],
      "1183":[
         "383.668",
         "383.928",
         "a"
      ],
      "1144":[
         "372.588",
         "372.718",
         "up"
      ],
      "1162":[
         "377.638",
         "377.928",
         "rial"
      ],
      "1218":[
         "395.798",
         "395.868",
         "me"
      ],
      "1145":[
         "372.718",
         "373.188",
         "So"
      ]
   }
}

如何找到So索引中的1200th字及其时间戳,该字段位于该数组的第0个和第1个索引中?

1 个答案:

答案 0 :(得分:1)

由于未知对象键,因此应以$objectToArray运算符开头,该运算符可以将timestamps转换为键和值的数组,如下所示:

{
    "k" : "1144",
    "v" : [ "372.588", "372.718", "up"]
},
{
    "k" : "1145",
    "v" : [ "372.718", "373.188", "So"]
},
...

然后,您可以使用$filter仅获取v包含您的输入短语的那些文档。整个聚合看起来像这样:

var input = "me";
db.col.aggregate([
    {
        $project: {
            foundElements: {
                $filter: {
                    input: { $objectToArray: "$timestamps" },
                    as: "ts",
                    cond: { $ne: [ { $indexOfArray: [ "$$ts.v", input ] }, -1 ] }
                }
            }
        }
    },
    {
        $project: {
            foundElements: {
                $map: {
                    input: "$foundElements",
                    as: "element",
                    in: { $slice: [ "$$element.v", 2 ] }
                }
            }
        }
    }
])
如果数组不包含指定的短语,则

$indexOfArray返回-1。要重塑结果,您可以将$map$slice结合使用,这将从数组中的前两个元素开始(第0个和第1个)。

输出:

{ "_id" : ..., "foundElements" : [ [ "395.798", "395.868" ] ] }