我在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中的元素?
发布于 2018-06-05 09:17:09
下面的查询用于用已更新的内容$addFields
覆盖现有someArray
的内容someArray
。
更新someArray
通过使用创建$map + $filter
。$map
阶段保留现有值并$filter
过滤someNestedArray
仅保留匹配值。
使用$project
而不是$addFields
in 3.2版本中
。
db.collection.aggregate([
{
$addFields: {
someArray: {
$map: {
input:"$someArray",
as: "resultm",
in: {
name: "$$resultm.name",
someNestedArray: {
$filter: {
input: "$$resultm.someNestedArray",
as: "resultf",
cond: {
$eq: ["$$resultf.name", "value"]
}
}
}
}
}
}
}
}
])
发布于 2018-06-05 10:39:23
从最简单的意义上讲,这跟MongoDB使用的“点符号”的基本形式相同。无论内部数组成员在哪个数组成员中,只要它匹配一个值就可以工作:
db.mycollection.find({
"someArray.someNestedArray.name": "value"
})
对于“单个字段”值来说,这很好,用于匹配你要使用的多个字段$elemMatch
:
db.mycollection.find({
"someArray": {
"$elemMatch": {
"name": "name1",
"someNestedArray": {
"$elemMatch": {
"name": "value",
"otherField": 1
}
}
}
}
})
我们可以通过应用做到这一点$filter
,并$map
在这里。这$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 ] }
]
}
}
}
}}
])
为了“只”投影匹配的元素,你需要的.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"
}}
}}
])
这使你可以为嵌套数组中的匹配“过滤”文档中的一个或多个结果。
https://stackoverflow.com/questions/-100004744
复制相似问题