데이터 입력과 관리

데이터 입력과 관리

이 문서는 생성된 컬렉션에 데이터를 입력과 수정, 삭제하는 방법에 대해 설명합니다.

삽입

다음과 같이 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_id3인 항목만 검색하면

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