在双嵌套数组MongoDB中查找
我在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"
{
"_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”
}}
}}
])
这允许您在嵌套数组中为文档中的一个或多个结果“过滤”匹配项。最简单的意义是,这只是遵循MongoDB使用的基本形式。无论内部数组成员位于哪个数组成员中,只要它匹配一个值,该操作都将起作用:
db.mycollection.find({
someArray.SomeNesteArray.name:“值”
})
这对于“单个字段”值很好,用于匹配您将使用的多个字段:
db.mycollection.find({
“someArray”:{
“$elemMatch”:{
“名称”:“名称1”,
“someNestedArray”:{
“$elemMatch”:{
“名称”:“值”,
“其他字段”:1
}
}
}
}
})
它与文档相匹配,文档中包含的内容在该“路径”处具有与值匹配的字段。如果您打算“匹配并筛选”结果,以便只返回匹配的元素,则位置运算符投影不可能:
嵌套数组
位置$operator不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$placeholder的替换项是单个值
现代蒙哥达
我们可以通过在这里应用和来实现这一点。确实需要$map
,因为“内部”数组可能会因“过滤”而改变,“外部”数组当然不符合“内部”被删除所有元素时的条件
再次以实际在每个数组中有多个要匹配的属性为例:
<代码
db.collection.aggregate(
{ $unwind: '$someArray' },
{
$project: {
'filteredValue': {
$filter: {
input: "$someArray.someNestedArray",
as: "someObj",
cond: { $eq: [ '$$someObj.name', 'delete me' ] }
}
}
}
}
)