반응형
MongoDB를 사용하여 하위 문서의 배열을 필터링하는 방법
다음과 같은 하위 문서에 배열이 있습니다.
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 1
},
{
"a" : 2
},
{
"a" : 3
},
{
"a" : 4
},
{
"a" : 5
}
]
}
a > 3의 서브 문서를 필터링 할 수 있습니까?
나의 예상 결과는 다음과 같다.
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 4
},
{
"a" : 5
}
]
}
사용하려고 합니다.$elemMatch
그러나 배열의 첫 번째 일치하는 요소를 반환합니다.
질문:
db.test.find( { _id" : ObjectId("512e28984815cbfcb21646a7") }, {
list: {
$elemMatch:
{ a: { $gt:3 }
}
}
} )
결과는 배열에서 하나의 요소를 반환합니다.
{ "_id" : ObjectId("512e28984815cbfcb21646a7"), "list" : [ { "a" : 4 } ] }
애그리게이트를 사용하여$match
동작하지 않는다
db.test.aggregate({$match:{_id:ObjectId("512e28984815cbfcb21646a7"), 'list.a':{$gte:5} }})
배열의 모든 요소를 반환합니다.
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 1
},
{
"a" : 2
},
{
"a" : 3
},
{
"a" : 4
},
{
"a" : 5
}
]
}
배열의 요소를 필터링하여 예상대로 결과를 얻을 수 있습니까?
사용.aggregate
올바른 접근법이지만$unwind
그list
어레이를 적용하기 전에$match
따라서 개별 요소를 필터링하고$group
다시 조립하는 방법:
db.test.aggregate([
{ $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
{ $unwind: '$list'},
{ $match: {'list.a': {$gt: 3}}},
{ $group: {_id: '$_id', list: {$push: '$list.a'}}}
])
출력:
{
"result": [
{
"_id": ObjectId("512e28984815cbfcb21646a7"),
"list": [
4,
5
]
}
],
"ok": 1
}
MongoDB 3.2 업데이트
3.2 릴리즈부터는 새로운 집약 연산자를 사용하여 이 작업을 보다 효율적으로 수행할 수 있습니다.list
필요한 요소$project
:
db.test.aggregate([
{ $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
{ $project: {
list: {$filter: {
input: '$list',
as: 'item',
cond: {$gt: ['$$item.a', 3]}
}}
}}
])
$and: 0-5 사이의 데이터 가져오기:
cond: {
$and: [
{ $gt: [ "$$item.a", 0 ] },
{ $lt: [ "$$item.a", 5) ] }
]}
위의 솔루션은 일치하는 하위 문서가 여러 개 필요한 경우에 가장 적합합니다.$elemMatch는 출력으로 일치하는 하위 문서가 하나 필요한 경우에도 매우 유용합니다.
db.test.find({list: {$elemMatch: {a: 1}}}, {'list.$': 1})
결과:
{
"_id": ObjectId("..."),
"list": [{a: 1}]
}
$filter 집약 사용
지정된 조건에 따라 반환할 배열의 하위 집합을 선택합니다.조건과 일치하는 요소만 포함하는 배열을 반환합니다.반환된 요소는 원래 순서입니다.
db.test.aggregate([
{$match: {"list.a": {$gt:3}}}, // <-- match only the document which have a matching element
{$project: {
list: {$filter: {
input: "$list",
as: "list",
cond: {$gt: ["$$list.a", 3]} //<-- filter sub-array based on condition
}}
}}
]);
언급URL : https://stackoverflow.com/questions/15117030/how-to-filter-array-in-subdocument-with-mongodb
반응형
'source' 카테고리의 다른 글
카르마가 오류 발생: "ng-html2js"를 로드할 수 없습니다.등록되지 않았습니다. (0) | 2023.04.04 |
---|---|
Calypso, Jetpack 및 Wordpress 블로그의 기술 아키텍처 (0) | 2023.04.04 |
false 체크 (0) | 2023.03.25 |
IPhone에서의 JSON 날짜 해석 (0) | 2023.03.25 |
Go 구조를 JSON으로 변환하는 중 (0) | 2023.03.25 |