데이터 입력과 관리
이 문서는 생성된 컬렉션에 데이터를 입력과 수정, 삭제하는 방법에 대해 설명합니다.
삽입
다음과 같이 example
컬렉션이 있을 때
{
"collection": "example",
"indexes": [
{
"fields": ["doc_id"],
"index_type": "kPrimaryKey"
}
]
}
DocumentDB.insert를 통해 데이터를 삽입할 수 있습니다.
from aeca import DocumentDB
doc_db = DocumentDB(channel)
collection_name = "example"
data = [
{"doc_id": "1", "content": "text 1"},
{"doc_id": "2", "content": "text 2"},
]
doc_db.insert(collection_name, data)
입력된 데이터는 DocumentDB.find 함수를 통해 검색할 수 있습니다. 자세한 내용은 검색에서 확인할 수 있습니다. 여기서는 query
를 {"$limit": 10}
로 입력하여 전체 데이터를 조회합니다.
df = doc_db.find(collection_name, query={"$limit": 10})
print(df)
다음과 같이 정상적으로 입력된 것을 확인할 수 있습니다.
content doc_id
0 text 1 1
1 text 2 2
Aeca가 데이터를 다루는 특징
만약 추가로 데이터를 입력하고 싶다면 다음과 같이 동일하게 실행할 수 있습니다. 이후 동일하게 전체 데이터를 확인합니다.
data = [
{"doc_id": 3, "content": "text 3"},
]
doc_db.insert(collection_name, data)
doc_db.find(collection_name, query={"$limit": 10})
이 경우 오류가 발생합니다. 이는 우리가 1, 2번 문서와 다르게 실수로 doc_id
를 int로 입력했기 때문입니다.
_InactiveRpcError: <_InactiveRpcError of RPC that terminated nith:
status = StatusCode.INTERNAL
details = "ABORTED: Type mismatch for column 'doc_id'. Type 'int32' cannot be converted to 'string'."
debug_error_string = "UNKNOWN:Error received from peer {created_time:"2023-09-14T21:59:45.453167204+09:00", grpc_status:13, grpc_message:"ABORTED: Type mismatch for column \'doc_id\'. Type \'int32\' cannot be converted to \'string\'."}"
>
만약 다음과 같이 doc_id
가 3
인 항목만 검색하면
df = doc_db.find(collection_name, {"doc_id": 3})
print(df)
print(df.dtypes)
다음과 같이 정상적으로 입력되어 있습니다.
content doc_id
0 text 3 3
content string[python]
doc_id Int32
dtype: object
결론적으로 데이터는 모두 잘 저장되었지만 조회 과정에서 3번째 레코드가 형이 다르기 때문에 형변환에 실패하여 오류가 발생했습니다.
아울러 레코드 별로 동일한 필드를 요구하지 않기 때문에 아래와 같이 extra
필드를 추가하고 삽입하면
data = [
{"doc_id": "4", "content": "text 4", "extra": "extra data"},
]
doc_db.insert(collection_name, data)
df = doc_db.find(collection_name, {"doc_id": "4"})
print(df)
다음과 같이 문제 없이 삽입이 가능합니다. 우리는 위에서 컬렉션을 정의할 때 content
를 비롯하여 데이터 필드에 대한 어떤 정의도 하지 않았습니다.
content doc_id extra
0 text 4 4 extra data
Aeca는 입력된 데이터를 처리할 때 다음과 같은 특징이 있습니다.
- 레코드는 입력된 데이터의 형을 따름
- 색인을 위한 스키마에 명세된 필드가 아니더라도 입력이 가능함
필요에 따라 스키마 정의에 따른 데이터 검증을 활성화 할 수 있는 기능은 개발 계획되어 있습니다.
삭제
위의 예시에서 잘못 입력된 3번 레코드를 삭제해 보겠습니다. 레코드 삭제는 DocumentDB.remove를 통해 실행할 수 있습니다.
doc_db.remove(collection_name, [{"doc_id": 3}])
df = doc_db.find(collection_name, {"$limit": 10})
print(df)
실행하면 다음과 같이 정상적으로 결과값을 받아 올 수 있음을 확인할 수 있습니다.
content doc_id extra
0 text 1 1 <NA>
1 text 2 2 <NA>
2 text 4 4 extra data
수정
이제 첫번째 레코드에 extra
필드에 데이터를 수정해 보겠습니다. 레코드의 수정은 DocumentDB.update를 통해 실행할 수 있습니다.
filter_
에 선택할 쿼리를 입력하고 updates
에 수정할 내용을 입력합니다.
doc_db.update(collection_name, filter_={"doc_id": "1"}, updates={"extra": "extra data"})
df = doc_db.find(collection_name, {"$limit": 10})
print(df)
다음과 같이 정상적으로 수정되었습니다.
content doc_id extra
0 text 1 1 extra data
1 text 2 2 <NA>
2 text 4 4 extra data