在最简单的意义上,这只是遵循了
"dot notation"
如MongoDB所用。无论内部数组成员在哪个数组成员中,只要它匹配一个值,它都可以工作:
db.mycollection.find({
"someArray.someNestedArray.name": "value"
})
对于“单个字段”值,对于匹配要使用的多个字段,这是很好的
$elemMatch
:
db.mycollection.find({
"someArray": {
"$elemMatch": {
"name": "name1",
"someNestedArray": {
"$elemMatch": {
"name": "value",
"otherField": 1
}
}
}
}
})
它与文档匹配,该文档将包含与值匹配的“路径”处的字段。如果您打算“匹配并过滤”结果,因此只返回匹配的元素,那么位置运算符投影不可能这样做,
as quoted
:
嵌套数组
位置$运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$占位符的替换是单个值
现代MongoDB
我们可以通过申请
$filter
和
$map
在这里。这个
美元地图
是真正需要的,因为“内部”数组可以由于“过滤”而改变,“外部”数组当然与“内部”被剥夺所有元素时的条件不匹配。
再次遵循在每个数组中实际要匹配多个属性的示例:
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 ] }
]
}
}
}
}}
])
因此在“外部”数组上
滤器
实际上是看
$size
在“内部”数组本身被“过滤”之后,所以当整个内部数组实际上与noting匹配时,可以拒绝这些结果。
旧版MongoDB
为了只“投影”匹配的元素,您需要
.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"
}}
}}
])
它允许您为文档中的一个或多个结果“筛选”嵌套数组中的匹配项。