gpt4 book ai didi

mongodb - 在双重嵌套数组 MongoDB 中查找

转载 作者:行者123 更新时间:2023-12-03 15:59:29 26 4
gpt4 key购买 nike

我在 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中按元素查找?

最佳答案

从最简单的意义上来说,这只是遵循 "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 是不可能实现这一点的。 :

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 来做到这一点和$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 ] }
]
}
}
}
}}
])

因此,在“外部”数组上 $filter实际上查看 $size “内部”数组本身被“过滤”之后,因此当整个内部数组实际上与注释匹配时,您可以拒绝这些结果。

旧版 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"
}}
}}
])

这允许您“过滤”嵌套数组中的匹配项以获取文档中的一个或多个结果。

关于mongodb - 在双重嵌套数组 MongoDB 中查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58834253/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com