Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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
在双嵌套数组MongoDB中查找_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

在双嵌套数组MongoDB中查找

在双嵌套数组MongoDB中查找,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我在mongodb有这个收藏 { "_id" : "777", "someKey" : "someValue", "someArray" : [ { "name" : "name1", "someNestedArray" : [ { "name" : "value" }, { "name" : "delete me"

我在mongodb有这个收藏

{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
    {
        "name" : "name1",
        "someNestedArray" : [
            {
                "name" : "value"
            },
            {
                "name" : "delete me"
            }
        ]
    }
  ]
}
我想查找基于someArray.someNestedArray.name的文档 但我找不到关于更新嵌套数组的所有搜索结果的任何有用链接 我正在尝试这个,但什么也没有返回

db.mycollection.find({"someArray.$.someNestedArray":{"$elemMatch":{"name":"1"}}})
db.mycollection.find({"someArray.$.someNestedArray.$.name":"1"})
还有别的


如何在双嵌套数组mongodb中查找by元素?

最简单的意义是,这只是遵循mongodb使用的as的基本形式。无论内部数组成员位于哪个数组成员中,只要它匹配一个值,该操作都将起作用:

db.mycollection.find({
someArray.SomeNesteArray.name:“值”
})
这对于“单个字段”值很好,用于匹配您将使用的多个字段:

db.mycollection.find({
“someArray”:{
“$elemMatch”:{
“名称”:“名称1”,
“someNestedArray”:{
“$elemMatch”:{
“名称”:“值”,
“其他字段”:1
}
}
}
}
})
它与文档相匹配,文档中包含的内容在该“路径”处具有与值匹配的字段。如果您打算“匹配并筛选”结果,以便只返回匹配的元素,则位置运算符投影不可能:

嵌套数组

位置$operator不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$placeholder的替换项是单个值

现代蒙哥达 我们可以通过在这里应用和来实现这一点。确实需要
$map
,因为“内部”数组可能会因“过滤”而改变,“外部”数组当然不符合“内部”被删除所有元素时的条件

再次以实际在每个数组中有多个要匹配的属性为例:

db.mycollection.aggregate([
{“$match”:{
“someArray”:{
“$elemMatch”:{
“名称”:“名称1”,
“someNestedArray”:{
“$elemMatch”:{
“名称”:“值”,
“其他字段”:1
}
}
}
}
}},
{“$addFields”:{
“someArray”:{
“$filter”:{
“输入”:{
“$map”:{
“输入”:“$someArray”,
“as”:“sa”,
“在”:{
“名称”:“$$sa.name”,
“someNestedArray”:{
“$filter”:{
“输入”:“$$sa.someNestedArray”,
“as”:“sn”,
“条件”:{
“$and”:[
{“$eq”:[“$$sn.name”,“value”]},
{“$eq”:[“$$sn.otherField”,1]}
]
}
}
}             
}
},
},
“as”:“sa”,
“条件”:{
“$and”:[
{“$eq”:[“$$sa.name”,“name1”]},
{“$gt”:[{“$size”:“$$sa.someNestedArray”},0]}
]
}
}
}
}}
])
因此,在“外部”数组上,在“内部”数组本身被“过滤”后,它实际上会查看“内部”数组的结果,因此当整个内部数组实际上不匹配时,您可以拒绝这些结果

老蒙哥达 为了仅“投影”匹配的元素,您需要以下方法:

db.mycollection.aggregate([
//匹配可能的文档
{“$match”:{
someArray.SomeNesteArray.name:“值”
}},
//展开每个阵列
{“$unwind”:“$someArray”},
{“$unwind”:“$someArray.someNestedArray”},
//只过滤匹配的元素
{“$match”:{
someArray.SomeNesteArray.name:“值”
}},
//组到内部数组
{“$组”:{
“_id”:{
“\u id”:“$\u id”,
“名称”:“$someArray.name”
},
“someKey”:{“$first”:“$someKey”},
“someNestedArray”:{“$push”:“$someArray.someNestedArray”}
}},
//组到外部阵列
{“$组”:{
“\u id”:“$\u id.\u id”,
“someKey”:{“$first”:“$someKey”},
“someArray”:{“$push”:{
“名称”:“$\u id.name”,
“someNestedArray”:“$someNestedArray”
}}
}} 
])

这允许您在嵌套数组中“筛选”文档中一个或多个结果的匹配项。

您也可以尝试以下操作:

db.collection.aggregate(
    { $unwind: '$someArray' },
    {
        $project: {
            'filteredValue': {
                $filter: {
                  input: "$someArray.someNestedArray",
                  as: "someObj",
                  cond: { $eq: [ '$$someObj.name', 'delete me' ] }
                }
            }
        }
    }
)

谢谢,对于“单个字段”值来说这很好,对于匹配多个字段,您将使用
$elemMatch
这一行向我阐明了
elemMatch
的确切用法,您的答案将改变我的项目!