pymongo에서 object 요소 find 연산하기

Mingtorr·2021년 4월 15일
0
post-thumbnail
post-custom-banner

mongodb를 사용할 때 배열로 구성된 속성 또는 객체로 구성된 속성을 검색해야 하는 경우가 종종발 발생합니다. 이 문서에서는 해당 요소들을 검색하는 방법에 대해 알아보고자 합니다.

1. 배열 요소 검색하기

배열요소를 검색할 경우 $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 안에 값들이 아닌 필드를 찾습니다.

2. 객체 요소 검색하기

객체요소에 대해 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엔 참 똑똑한 사람이 많은 것 같습니다.

profile
츄르 값 벌기 위해 코딩하는 아키텍쳐
post-custom-banner

0개의 댓글