mongodb를 사용할 때 배열로 구성된 속성 또는 객체로 구성된 속성을 검색해야 하는 경우가 종종발 발생합니다. 이 문서에서는 해당 요소들을 검색하는 방법에 대해 알아보고자 합니다.
배열요소를 검색할 경우 $elemMath
쿼리문을 사용하여 검색이 가능합니다. 먼저 mongodb에 저장된 내용은 다음과 같습니다.
{ "_id": 1, "results": [ { "product": "abc", "score": 10 },
{ "product": "xyz", "score": 5 } ] },
{ "_id": 2, "results": [ { "product": "abc", "score": 8 },
{ "product": "xyz", "score": 7 } ] },
{ "_id": 3, "results": [ { "product": "abc", "score": 7 },
{ "product": "xyz", "score": 8 } ] },
{ "_id": 4, "results": [ { "product": "abc", "score": 7 },
{ "product": "def", "score": 8 } ] }
여기서 result의 요소에 대해 find 연산을 하는 쿼리문은 아래와 같습니다.
mydb["data"].find({ results: { $elemMatch: { product: "xyz"} } })
위 코드에 비교연산을 추가하여 더 상세한 검색도 가능합니다.
mydb["data"].find(
{ results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } }
)
비교연산자의 종류는 아래와 같습니다.
연산자 | 의미 |
---|---|
$gt | 해당 값보다 더 큰 값을 가진 필드를 찾습니다. 숫자 뿐만 아니라 날짜와 ObjectId도 비교할 수 있습니다. |
$lt | 해당 값보다 작은 값을 가진 필드를 찾습니다 |
$gte | 해당 값보다 크거나 같은 값을 가진 필드를 찾습니다 |
$lte | 해당 값보다 작거나 같은 값을 가진 필드를 찾습니다 |
$eq | 해당 값과 일치하는 값을 가진 필드를 찾습니다. |
$ne | 해당 값과 일치하지 않는 값을 가진 필드를 찾습니다. |
$in | 필드의 값이 $in 안에 들어있는 값들 중 하나인 필드를 찾습니다. |
$nin | 필드의 값이 $nin 안에 값들이 아닌 필드를 찾습니다. |
객체요소에 대해 find하는 방법은 간단합니다.
{
"_id": {
"$oid": "607884948d2a7061dc04ed6e"
},
"type": "Feature",
"properties": {
"EMD_CD": "11440124",
"EMD_NM": "연남동",
"SGG_OID": 4579
},
위와 같은 객체요소가 존재한다고 가정합니다. EMD_NM
요소에 대해 검색하기 위해서는 간단하게 properties.EMD_NM
를 사용하면 값에 접근할 수 있습니다. 예제 코드입니다.
@app.route('/', methods=['GET', 'POST'])
def poster():
result = list(mydb["polygon"].find({"properties.EMD_NM": "연남동"}).limit(1))
return json.dumps(result, default=json_util.default)
이상으로 배열과 객체 요소를 find하는 방법에 대해 알아보았습니다.
stackoverflow엔 참 똑똑한 사람이 많은 것 같습니다.