MongoDB를 사용하여 하위 문서에서 배열을 필터링하는 방법 [중복]
이 질문에 이미 답변이 있습니다.
이 같은 하위 문서에 배열이 있습니다.
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 1
},
{
"a" : 2
},
{
"a" : 3
},
{
"a" : 4
},
{
"a" : 5
}
]
}
> 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 업데이트
Starting with the 3.2 release, you can use the new $filter
aggregation operator to do this more efficiently by only including the list
elements you want during a $project
:
db.test.aggregate([
{ $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
{ $project: {
list: {$filter: {
input: '$list',
as: 'item',
cond: {$gt: ['$$item.a', 3]}
}}
}}
])
Above solution works best if multiple matching sub documents are required. $elemMatch also comes in very use if single matching sub document is required as output
db.test.find({list: {$elemMatch: {a: 1}}}, {'list.$': 1})
Result:
{
"_id": ObjectId("..."),
"list": [{a: 1}]
}
Selects a subset of the array to return based on the specified condition. Returns an array with only those elements that match the condition. The returned elements are in the original order.
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
'Program Tip' 카테고리의 다른 글
본문 텍스트에서 단어 교체 (0) | 2020.10.07 |
---|---|
EL 빈 연산자는 JSF에서 어떻게 작동합니까? (0) | 2020.10.07 |
Hadoop없이 Apache Spark를 실행할 수 있습니까? (0) | 2020.10.07 |
Postgres에서 테이블 (인덱스 포함) 복사 (0) | 2020.10.07 |
web.config 연결 문자열의 이스케이프 따옴표 (0) | 2020.10.07 |