在双嵌套数组中查找 MongoDB
Find in Double Nested Array MongoDB
我在 mongodb
中有这个 Collection
{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
{
"name" : "name1",
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
]
}
我想根据 someArray.someNestedArray.name 查找文档
但我找不到任何有用的 link 所有关于更新嵌套数组的搜索结果
我正在尝试这个,但是 return 什么都没有
db.mycollection.find({"someArray.$.someNestedArray":{"$elemMatch":{"name":"1"}}})
db.mycollection.find({"someArray.$.someNestedArray.$.name":"1"})
还有其他事情
如何在双嵌套数组中按元素查找 mongodb?
在最简单的意义上,这只是遵循 MongoDB 使用的 "dot notation" 的基本形式。无论内部数组成员在哪个数组成员中,只要它匹配一个值,这都会起作用:
db.mycollection.find({
"someArray.someNestedArray.name": "value"
})
这对于 "single field" 值很好,要匹配多个字段,您可以使用 $elemMatch
:
db.mycollection.find({
"someArray": {
"$elemMatch": {
"name": "name1",
"someNestedArray": {
"$elemMatch": {
"name": "value",
"otherField": 1
}
}
}
}
})
匹配包含某个字段的文档,该字段 "path" 匹配该值。如果您打算 "match and filter" 结果只返回匹配的元素,这对于位置运算符投影是不可能的,as quoted:
Nested Arrays
The positional $ operator cannot be used for queries which traverse more than one array, such as queries that traverse arrays nested within other arrays, because the replacement for the $ placeholder is a single value
现代MongoDB
我们可以通过在此处应用 $filter
and $map
来做到这一点。 $map
是真正需要的,因为 "inner" 数组可以作为 "filtering" 的结果而改变,而 "outer" 数组当然不符合 [=51] 时的条件=] 被剥离了所有元素。
再次按照实际在每个数组中匹配多个属性的示例:
db.mycollection.aggregate([
{ "$match": {
"someArray": {
"$elemMatch": {
"name": "name1",
"someNestedArray": {
"$elemMatch": {
"name": "value",
"otherField": 1
}
}
}
}
}},
{ "$addFields": {
"someArray": {
"$filter": {
"input": {
"$map": {
"input": "$someArray",
"as": "sa",
"in": {
"name": "$$sa.name",
"someNestedArray": {
"$filter": {
"input": "$$sa.someNestedArray",
"as": "sn",
"cond": {
"$and": [
{ "$eq": [ "$$sn.name", "value" ] },
{ "$eq": [ "$$sn.otherField", 1 ] }
]
}
}
}
}
},
},
"as": "sa",
"cond": {
"$and": [
{ "$eq": [ "$$sa.name", "name1" ] },
{ "$gt": [ { "$size": "$$sa.someNestedArray" }, 0 ] }
]
}
}
}
}}
])
因此在 "outer" 数组上,"inner" 数组的 $filter
actually looks at the $size
是 "filtered" 本身,因此当整个内部数组执行时,您可以拒绝这些结果事实上匹配注意。
年长 MongoDB
为了"project"只匹配元素,你需要.aggregate()
方法:
db.mycollection.aggregate([
// Match possible documents
{ "$match": {
"someArray.someNestedArray.name": "value"
}},
// Unwind each array
{ "$unwind": "$someArray" },
{ "$unwind": "$someArray.someNestedArray" },
// Filter just the matching elements
{ "$match": {
"someArray.someNestedArray.name": "value"
}},
// Group to inner array
{ "$group": {
"_id": {
"_id": "$_id",
"name": "$someArray.name"
},
"someKey": { "$first": "$someKey" },
"someNestedArray": { "$push": "$someArray.someNestedArray" }
}},
// Group to outer array
{ "$group": {
"_id": "$_id._id",
"someKey": { "$first": "$someKey" },
"someArray": { "$push": {
"name": "$_id.name",
"someNestedArray": "$someNestedArray"
}}
}}
])
这允许您 "filter" 嵌套数组中的匹配项以获取文档中的一个或多个结果。
您也可以尝试以下操作:
db.collection.aggregate(
{ $unwind: '$someArray' },
{
$project: {
'filteredValue': {
$filter: {
input: "$someArray.someNestedArray",
as: "someObj",
cond: { $eq: [ '$$someObj.name', 'delete me' ] }
}
}
}
}
)
我在 mongodb
中有这个 Collection{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
{
"name" : "name1",
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
]
}
我想根据 someArray.someNestedArray.name 查找文档 但我找不到任何有用的 link 所有关于更新嵌套数组的搜索结果 我正在尝试这个,但是 return 什么都没有
db.mycollection.find({"someArray.$.someNestedArray":{"$elemMatch":{"name":"1"}}})
db.mycollection.find({"someArray.$.someNestedArray.$.name":"1"})
还有其他事情
如何在双嵌套数组中按元素查找 mongodb?
在最简单的意义上,这只是遵循 MongoDB 使用的 "dot notation" 的基本形式。无论内部数组成员在哪个数组成员中,只要它匹配一个值,这都会起作用:
db.mycollection.find({
"someArray.someNestedArray.name": "value"
})
这对于 "single field" 值很好,要匹配多个字段,您可以使用 $elemMatch
:
db.mycollection.find({
"someArray": {
"$elemMatch": {
"name": "name1",
"someNestedArray": {
"$elemMatch": {
"name": "value",
"otherField": 1
}
}
}
}
})
匹配包含某个字段的文档,该字段 "path" 匹配该值。如果您打算 "match and filter" 结果只返回匹配的元素,这对于位置运算符投影是不可能的,as quoted:
Nested Arrays
The positional $ operator cannot be used for queries which traverse more than one array, such as queries that traverse arrays nested within other arrays, because the replacement for the $ placeholder is a single value
现代MongoDB
我们可以通过在此处应用 $filter
and $map
来做到这一点。 $map
是真正需要的,因为 "inner" 数组可以作为 "filtering" 的结果而改变,而 "outer" 数组当然不符合 [=51] 时的条件=] 被剥离了所有元素。
再次按照实际在每个数组中匹配多个属性的示例:
db.mycollection.aggregate([
{ "$match": {
"someArray": {
"$elemMatch": {
"name": "name1",
"someNestedArray": {
"$elemMatch": {
"name": "value",
"otherField": 1
}
}
}
}
}},
{ "$addFields": {
"someArray": {
"$filter": {
"input": {
"$map": {
"input": "$someArray",
"as": "sa",
"in": {
"name": "$$sa.name",
"someNestedArray": {
"$filter": {
"input": "$$sa.someNestedArray",
"as": "sn",
"cond": {
"$and": [
{ "$eq": [ "$$sn.name", "value" ] },
{ "$eq": [ "$$sn.otherField", 1 ] }
]
}
}
}
}
},
},
"as": "sa",
"cond": {
"$and": [
{ "$eq": [ "$$sa.name", "name1" ] },
{ "$gt": [ { "$size": "$$sa.someNestedArray" }, 0 ] }
]
}
}
}
}}
])
因此在 "outer" 数组上,"inner" 数组的 $filter
actually looks at the $size
是 "filtered" 本身,因此当整个内部数组执行时,您可以拒绝这些结果事实上匹配注意。
年长 MongoDB
为了"project"只匹配元素,你需要.aggregate()
方法:
db.mycollection.aggregate([
// Match possible documents
{ "$match": {
"someArray.someNestedArray.name": "value"
}},
// Unwind each array
{ "$unwind": "$someArray" },
{ "$unwind": "$someArray.someNestedArray" },
// Filter just the matching elements
{ "$match": {
"someArray.someNestedArray.name": "value"
}},
// Group to inner array
{ "$group": {
"_id": {
"_id": "$_id",
"name": "$someArray.name"
},
"someKey": { "$first": "$someKey" },
"someNestedArray": { "$push": "$someArray.someNestedArray" }
}},
// Group to outer array
{ "$group": {
"_id": "$_id._id",
"someKey": { "$first": "$someKey" },
"someArray": { "$push": {
"name": "$_id.name",
"someNestedArray": "$someNestedArray"
}}
}}
])
这允许您 "filter" 嵌套数组中的匹配项以获取文档中的一个或多个结果。
您也可以尝试以下操作:
db.collection.aggregate(
{ $unwind: '$someArray' },
{
$project: {
'filteredValue': {
$filter: {
input: "$someArray.someNestedArray",
as: "someObj",
cond: { $eq: [ '$$someObj.name', 'delete me' ] }
}
}
}
}
)