이러한 활동으로 컨퍼런스를 후원할 때는 보통 참석자에게 배지를 스캔하여 Couchbase 업데이트를 보낼 수 있는지 물어봅니다. 그래서 그렇게 했습니다. 그리고 때로는 정보를 쉽게 복구할 수 있지만 때로는 약간 까다로울 때도 있습니다. 여기에는 QR 코드에 VC카드가 포함되어 있었습니다. 아시다시피 스캔은 회의의 통화이기 때문에 연락처 정보와 귀중한 정보를 담는 것이 목적입니다. 덕분에 다음 해에 더 많은 아이스크림을 가지고 다시 돌아올 수 있습니다.
어쨌든 많은 수의 VC카드를 수집하게 되었지만, 이를 유비쿼터스 마케팅 형식인 CSV에 넣는 것은 어려웠습니다. 그렇다면 데이터를 조작해야 할 때는 어떻게 하나요? Couchbase Shell을 사용합니다.
카우치베이스 쉘, 쉘 예!
카우치베이스 셸 (cbsh)는 현대적이고 생산적이며 재미있는 Couchbase Server 및 Capella(클라우드 DBaaS)용 셸입니다. 소스 코드와 설치 방법은 리포지토리에서 확인할 수 있습니다. Readme.
저는 직접 복제하고 빌드하여 설치했습니다:
|
1 2 3 |
git clone https://github.com/couchbaselabs/couchbase-shell cd couchbase-shell cargo install --path . |
다음이 필요합니다. Rust 툴체인 를 설치했는데, Couchbase Shell은 제가 가장 좋아하는 셸을 기반으로 Rust로 작성되었기 때문입니다, nushell.
설치가 완료되면 다음과 같이 입력하여 실행할 수 있습니다. cbsh. 먼저 Couchbase 연결을 구성하라는 메시지가 표시됩니다. Capella 관리 인터페이스를 사용하는 경우 모든 필수 정보는 연결 탭을 클릭합니다.
누쉘 <3 JSON
참고로 제 VC카드는 이렇게 생겼습니다:
|
1 2 3 4 5 6 |
BEGIN:VCARD VERSION:2.1 N:DOGUIN;Laurent;;; ORG:Couchbase EMAIL;INTERNET:laurent.doguin@couchbase.com END:VCARD |
이를 JSON으로 변환할 수 있는 많은 노드 라이브러리가 있습니다. vcard-json. 따라서 다음과 같이 실행하면 vcard2json.js 노드를 호출하면 모든 VCard 콘텐츠가 JSON 객체로 포함된 JSON 배열을 가져옵니다.
훌륭하지만 어떻게 쉽게 조작할 수 있을까요? Cbsh는 누쉘을 기반으로하기 때문에 다음과 같은 모든 좋은 점을 얻을 수 있습니다. json에서 명령 또는 어디 필터와 JSON 선택. 이제 nushell에서 제공하는 구조화된 데이터 출력을 통해 단계별로 어떻게 작동하는지 살펴보겠습니다:
|
1 2 3 4 5 |
👤 Laurent Doguin 🏠 capella > node vcard2json.js [{"name":{"surname":"Doguin","name":"Laurent","additionalName":"","prefix":"","suffix":""},"organization":"Couchbase","email":[{"isDefault":false,"valueInfo":{},"value":"laurentdoguin@couchbase.com"}]},{"name":{"surname":"This","name":"Person","additionalName":"","prefix":"","suffix":""},"organization":"DoesNotWorkAtCouchbase","email":[{"isDefault":false,"valueInfo":{},"value":"thiperson@notcouchbase.com"}]}] |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
👤 Laurent Doguin 🏠 capella > node vcard2json.js | from json ╭───┬──────────────────────────────┬────────────────────────┬─────────────────────────────────────────────────────────────────────╮ │ # │ name │ organization │ email │ ├───┼──────────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────┤ │ 0 │ ╭────────────────┬─────────╮ │ Couchbase │ ╭───┬───────────┬───────────────────┬─────────────────────────────╮ │ │ │ │ surname │ Doguin │ │ │ │ # │ isDefault │ valueInfo │ value │ │ │ │ │ name │ Laurent │ │ │ ├───┼───────────┼───────────────────┼─────────────────────────────┤ │ │ │ │ additionalName │ │ │ │ │ 0 │ false │ {record 0 fields} │ laurentdoguin@couchbase.com │ │ │ │ │ prefix │ │ │ │ ╰───┴───────────┴───────────────────┴─────────────────────────────╯ │ │ │ │ suffix │ │ │ │ │ │ │ ╰────────────────┴─────────╯ │ │ │ │ 1 │ ╭────────────────┬────────╮ │ DoesNotWorkAtCouchbase │ ╭───┬───────────┬───────────────────┬────────────────────────────╮ │ │ │ │ surname │ This │ │ │ │ # │ isDefault │ valueInfo │ value │ │ │ │ │ name │ Person │ │ │ ├───┼───────────┼───────────────────┼────────────────────────────┤ │ │ │ │ additionalName │ │ │ │ │ 0 │ false │ {record 0 fields} │ thiperson@notcouchbase.com │ │ │ │ │ prefix │ │ │ │ ╰───┴───────────┴───────────────────┴────────────────────────────╯ │ │ │ │ suffix │ │ │ │ │ │ │ ╰────────────────┴────────╯ │ │ │ ╰───┴──────────────────────────────┴────────────────────────┴─────────────────────────────────────────────────────────────────────╯ |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
👤 Laurent Doguin 🏠 capella > node vcard2json.js | from json | where organization != 'Couchbase' ╭───┬─────────────────────────────┬────────────────────────┬────────────────────────────────────────────────────────────────────╮ │ # │ name │ organization │ email │ ├───┼─────────────────────────────┼────────────────────────┼────────────────────────────────────────────────────────────────────┤ │ 0 │ ╭────────────────┬────────╮ │ DoesNotWorkAtCouchbase │ ╭───┬───────────┬───────────────────┬────────────────────────────╮ │ │ │ │ surname │ This │ │ │ │ # │ isDefault │ valueInfo │ value │ │ │ │ │ name │ Person │ │ │ ├───┼───────────┼───────────────────┼────────────────────────────┤ │ │ │ │ additionalName │ │ │ │ │ 0 │ false │ {record 0 fields} │ thiperson@notcouchbase.com │ │ │ │ │ prefix │ │ │ │ ╰───┴───────────┴───────────────────┴────────────────────────────╯ │ │ │ │ suffix │ │ │ │ │ │ │ ╰────────────────┴────────╯ │ │ │ ╰───┴─────────────────────────────┴────────────────────────┴────────────────────────────────────────────────────────────────────╯ |
|
1 2 3 4 5 6 7 |
👤 Laurent Doguin 🏠 capella > node vcard2json.js | from json | where organization != 'Couchbase' | select name.name name.surname organization email.0.value ╭───┬───────────┬──────────────┬────────────────────────┬────────────────────────────╮ │ # │ name_name │ name_surname │ organization │ email_0_value │ ├───┼───────────┼──────────────┼────────────────────────┼────────────────────────────┤ │ 0 │ Person │ This │ DoesNotWorkAtCouchbase │ thiperson@notcouchbase.com │ ╰───┴───────────┴──────────────┴────────────────────────┴────────────────────────────╯ |
이제 데이터가 준비되고 정리되었으니 이 데이터로 무엇을 할 수 있나요? 이 데이터를 다음과 같이 CSV 파일에 쓸 수 있습니다:
|
1 |
> node vcard2json.js | from json | where organization != 'Couchbase' | select name.name name.surname organization email.0.value | to csv| save contacts.csv |
Couchbase에 쓸 수도 있습니다. 이미 자격 증명을 모두 설정했습니다. 첫 번째 명령은 버킷과 기본 범위 및 컬렉션을 선택합니다. 두 번째 명령은 JSON 배열을 반복하고, 임의의 UUID를 생성하고, 콘텐츠를 콘텐츠 열 아래에 래핑하고, 생성된 UUID로 ID 열을 추가한 다음, 그 결과를 Couchbase에 삽입합니다.
|
1 2 3 |
👤 Laurent Doguin 🏠 capella > cb-env bucket vcard |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
👤 Laurent Doguin 🏠 capella in ☁️ vcard._default._default > node vcard2json.js | from json | where organization != 'Couchbase' |select name.name name.surname organization email.0.value |rename firstname lastname organization email | each { |it| let uuid = {random uuid}; $it | wrap content| insert id $uuid | doc upsert } ╭───┬───────────────────────────────────────────────────────────╮ │ 0 │ ╭───┬───────────┬─────────┬────────┬──────────┬─────────╮ │ │ │ │ # │ processed │ success │ failed │ failures │ cluster │ │ │ │ ├───┼───────────┼─────────┼────────┼──────────┼─────────┤ │ │ │ │ 0 │ 1 │ 1 │ 0 │ │ capella │ │ │ │ ╰───┴───────────┴─────────┴────────┴──────────┴─────────╯ │ │ 1 │ ╭───┬───────────┬─────────┬────────┬──────────┬─────────╮ │ │ │ │ # │ processed │ success │ failed │ failures │ cluster │ │ │ │ ├───┼───────────┼─────────┼────────┼──────────┼─────────┤ │ │ │ │ 0 │ 1 │ 1 │ 0 │ │ capella │ │ │ │ ╰───┴───────────┴─────────┴────────┴──────────┴─────────╯ │ ╰───┴───────────────────────────────────────────────────────────╯ |
그리고 작동 여부를 확인하기 위해 SQL++로 데이터를 직접 쿼리할 수 있습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
👤 Laurent Doguin 🏠 capella in ☁️ vcard._default._default > query "SELECT * from `vcard`" ╭───┬────────────────────────────────────────────────┬─────────╮ │ # │ vcard │ cluster │ ├───┼────────────────────────────────────────────────┼─────────┤ │ 0 │ ╭──────────────┬─────────────────────────────╮ │ capella │ │ │ │ firstname │ Person1 │ │ │ │ │ │ lastname │ LastNa │ │ │ │ │ │ organization │ Organisat │ │ │ │ │ │ email │ person1lastna@couchbase.com │ │ │ │ │ ╰──────────────┴─────────────────────────────╯ │ │ │ 1 │ ╭──────────────┬────────────────────────────╮ │ capella │ │ │ │ firstname │ Person │ │ │ │ │ │ lastname │ This │ │ │ │ │ │ organization │ DoesNotWorkAtCouchbase │ │ │ │ │ │ email │ thiperson@notcouchbase.com │ │ │ │ │ ╰──────────────┴────────────────────────────╯ │ │ ╰───┴────────────────────────────────────────────────┴─────────╯ |
여기까지 Couchbase Shell을 사용하여 데이터를 조작하고, 변환하고, Couchabse로 가져오는 실용적인 예시입니다. 하지만 다른 용도로도 많이 사용하실 수 있습니다! 어떤 것을 가장 좋아하시나요?