이중 중첩 배열 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에서 요소별로 어떻게 찾을 수 있습니까?
가장 단순한 의미에서 이것은 MongoDB에서 사용되는 "도트 표기법"의 기본 형태를 따릅니다.값과 일치하는 경우 내부 어레이 멤버가 어떤 어레이 멤버에 속해 있는지에 관계없이 작동합니다.
db.mycollection.find({
"someArray.someNestedArray.name": "value"
})
여러 필드를 일치시키기 위해 사용하는 "단일 필드" 값이면 됩니다.
db.mycollection.find({
"someArray": {
"$elemMatch": {
"name": "name1",
"someNestedArray": {
"$elemMatch": {
"name": "value",
"otherField": 1
}
}
}
}
})
이 값은 값과 일치하는 "경로"에 필드가 있는 항목이 포함된 문서와 일치합니다.일치된 요소만 반환되도록 결과를 "일치 및 필터링"하려는 경우, 인용된 위치 연산자 투영에서는 이 작업을 수행할 수 없습니다.
중첩 배열
$ 자리 표시자의 대체 값이 단일 값이기 때문에 다른 배열 내에 중첩된 배열을 통과하는 쿼리와 같이 둘 이상의 배열을 통과하는 쿼리에는 위치 $ 연산자를 사용할 수 없습니다.
모던몽고DB
우리는 이것을 신청하고 여기서 할 수 있습니다.그$map이 필요한 것은 "dll" 배열이 "dll"로 인해 변경될 수 있고, 물론 "dll" 배열이 모든 요소에서 "dll"이 제거된 조건과 일치하지 않기 때문입니다.
각 어레이 내에서 일치하는 여러 속성을 실제로 갖는 예를 다시 한 번 보여 줍니다.
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 ] }
]
}
}
}
}}
])
따라서 "외부" 배열에서 는 "내부" 배열 자체를 "필터링"한 후 실제로 "내부" 배열을 살펴봅니다. 따라서 전체 내부 배열이 실제로 일치하는 경우 이러한 결과를 거부할 수 있습니다.
이전 MongoDB
일치하는 요소만 "투영"하려면 다음 방법이 필요합니다.
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"
}}
}}
])
이렇게 하면 문서 내에서 하나 이상의 결과에 대한 중첩 배열의 일치 항목을 "필터링"할 수 있습니다.
다음과 같은 방법을 사용할 수도 있습니다.
db.collection.aggregate(
{ $unwind: '$someArray' },
{
$project: {
'filteredValue': {
$filter: {
input: "$someArray.someNestedArray",
as: "someObj",
cond: { $eq: [ '$$someObj.name', 'delete me' ] }
}
}
}
}
)
언급URL : https://stackoverflow.com/questions/29071748/find-in-double-nested-array-mongodb
'programing' 카테고리의 다른 글
| 루비: 젬파일에서 'require: false'는 무엇을 의미합니까? (0) | 2023.06.03 |
|---|---|
| TextBox 입력 제한을 정의하는 방법은 무엇입니까? (0) | 2023.06.03 |
| UITableView Section 제목을 프로그래밍 방식으로 설정하는 방법(iPhone/iPad)은 무엇입니까? (0) | 2023.06.03 |
| 사용을 종료하면 열려 있는 SQL 연결이 닫힙니다. (0) | 2023.06.03 |
| 색의 16진수 투명도 (0) | 2023.06.03 |