몇 달 전, Node.js 클라이언트 사용자들과 이야기를 나누던 중 사람들이 Node.js에서 Couchbase를 사용할 때 삶을 좀 더 단순화할 수 있는 방법을 찾고 있다는 꽤 일반적인 의견을 들었습니다. 특히 제가 많이 들었던 것 중 하나는 모든 상용구를 직접 수동으로 작성할 필요가 없도록 자동으로 생성된 모델을 사용할 수 있는 방법을 찾고 있다는 것이었습니다.
이에 대응하기 위해 저는 Ottoman이라는 새로운 라이브러리 작업을 시작했습니다. Ottoman은 Couchbase를 중심으로 설계된 실험적인 ODM입니다. 이 시점에서 저는 Ottoman이 외부에서 살펴보기 시작할 만큼 충분히 기능이 풍부하다고 생각합니다. 소스에 숨어 있는 버그와 개선할 수 있는 기능이 있다는 것을 알고 있지만 여러분의 도움을 받고 싶습니다! 여러분이 무엇을 보고 싶고 무엇이 가장 도움이 될지 가장 잘 알고 있는 사람이므로 질문, 의견 및/또는 우려 사항을 최대한 많이 말씀해 주세요.
이제 몇 가지 설명으로 넘어가겠습니다!
라이브러리는 모델이 어떻게 생겼는지에 대한 정의를 작성한 다음 일반적으로 이와 관련된 모든 상용구를 자동 생성하도록 하기 위한 것입니다. 예를 들어 다음을 살펴보세요:
'username': '문자열',
'name': '문자열',
'이메일': '문자열'
}, {
버킷: new 카우치베이스.연결({})
});
이 예는 5개의 필드(예, 5개)가 포함된 간단한 사용자 모델을 만드는 방법을 보여줍니다(아래에서 설명하겠습니다). 여기에는 직관적으로 사용자 이름, 이름, 이메일의 세 가지 문자열 필드가 포함되어 있습니다. 또한 2 숨겨진 필드에 추가되고 재정의할 수 있습니다. 이러한 필드는 _type 및 _id 필드로, 이 문서가 어떤 모델인지에 대한 문자열과 고유 식별 문자열을 포함하며 기본값은 UUIDv4 uuid를 사용합니다.
모델 함수의 반환 객체는 모델의 새 인스턴스를 인스턴스화하는 데 사용할 수 있는 함수이므로 새로 생성된 모델을 사용하는 것은 매우 간단합니다. 따라서 위의 예에 따라 다음과 같이 새 사용자를 만들고 저장할 수 있습니다:
테스트.사용자 이름 = 'brett19';
테스트.이름 = '브렛 로슨';
테스트.이메일 = 'brett19@gmail.com';
Ottoman.저장(테스트, 함수(err) {
만약 (err) throw err;
콘솔.로그('저장됨');
});
또한 Ottoman에서는 다음과 같이 findById를 사용하여 이전에 데이터베이스에 저장된 객체를 빠르게 로드할 수 있습니다:
만약 (err) throw err;
콘솔.로그(obj.이름);
// 브렛 로슨
});
지금까지는 기본적으로 오스만에서 할 수 있는 간단한 로드/저장 작업 몇 가지를 살펴봤는데, 이제 좀 더 깊이 들어가서 오스만이 생산성 향상에 실제로 어떤 도움을 줄 수 있는지 살펴보겠습니다. 이제 블로그 사이트를 구축 중이고 사용자와 관련된 블로그 게시물을 저장해야 한다고 가정해 보겠습니다. 이를 위한 모델을 구축해 봅시다.
'크리에이터': '사용자',
'title': '문자열',
'content': '문자열'
}, {
버킷: …
});
여기서 필드 유형 중 하나가 실제로 위에서 만든 User 객체를 참조하는 것을 볼 수 있습니다. 이를 통해 데이터베이스에 저장된 다른 문서를 참조하는 새 BlogPost를 만들 수 있습니다. 임베드할 모델을 구성할 수도 있습니다. 사용자의 현재 GPS 위치뿐만 아니라 사용자가 글을 작성할 때의 GPS 위치를 저장하고 싶다고 가정해 보겠습니다. 이와 같은 모델을 정의하고 User 및 BlogPost에서 사용하면 일반적인 참조 문서가 아닌 각각의 객체에 데이터가 직접 임베드되지만 직렬화 해제 시에는 GPSPosition으로 유지됩니다.
위도: '숫자',
long: '숫자'
}, {
embed: true
});
오늘 마지막으로 말씀드리고 싶은 흥미로운 기능은 모델에 대한 기본 조회를 미리 수행할 수 있는 맵/축소 보기를 자동으로 생성하는 기능입니다. 이 기능은 매우 실험적인 기능이며 가장 일반적인 사용 사례 중 일부에서만 작동한다는 점을 미리 말씀드리고 싶습니다. 또한 이 기능에는 다음과 같은 주의 사항이 있습니다. 등록 디자인 문서 모델을 등록한 후에 오스만 객체에 대한 뷰를 생성하는 것이 모델 연결을 결정하는 유일한 방법이며, 또한 앱을 시작할 때마다 이러한 뷰를 다시 생성하는 것은 매우 비효율적이기 때문에 일반적으로 일종의 설정 단계 현재로서는
블로그의 예를 더 자세히 살펴보기 위해 사용자의 블로그 게시물 목록이 필요하다고 가정해 보겠습니다. 일반적으로는 찾고자 하는 특정 사용자의 작성자 참조에 있는 모든 블로그 게시물을 검색하여 이 목록을 추출하는 뷰를 수동으로 작성해야 합니다. Ottoman을 사용하면 훨씬 더 간단합니다. 다음과 같이 User 객체의 속성에서 쿼리를 정의하기만 하면 됩니다:
내 게시물: {
대상: 'BlogPost',
맵핑된 기준: '크리에이터',
정렬: 'desc',
limit: 5
}
},
이제 User 인스턴스에서 myPosts 메서드를 호출하기만 하면 사용자가 작성한 게시물을 요청할 수 있으며, 이 사용자가 게시한 BlogPost 객체 목록이 반환되고 이러한 객체의 위치 및 역직렬화가 자동으로 처리됩니다.
오늘 소개할 시간이 없어 소개하지 못했지만, 더 많은 기능을 확인하고 싶거나 더 나은 Ottoman을 만드는 데 도움을 주고 싶다면 여기 GitHub 페이지로 이동하세요: https://github.com/couchbaselabs/node-ottoman/ !
건배! Brett
Brett,
Couch의 오브젝트 모델을 검색하다가 NPM과 블로그 게시물을 발견했습니다.
여러분[과 다른 Node.js 사용자]은 이 기능이 절실히 필요하다는 것을 잘 알고 있습니다.
이런 말은 하기 싫지만, 몽구스는 사용 편의성 측면에서 이미 스키마가 잘 갖춰져 있는 것 같아서 Couch 세계에 조금 더 가까워졌습니다. 물론 몽구스가 모든 것을 제대로 갖추고 있다는 말은 아닙니다.)
완전히 투명하고 숨겨진 ID와 유형도 IMHO의 방식입니다(여기 몽구스 :).
깃허브를 포크해서 플레이해 볼게요.
건배,
-m
안녕하세요, 마크
소스나 오스만 전반에 대해 궁금한 점이 있으면 알려주세요. 아직 문서화 작업을 진행 중인 기능이 많으며, 아직 프로토타이핑 중인 쿼리 코드를 제외하면 소스 코드를 살펴보는 데 큰 무리가 없을 것입니다.
건배, 브렛
잘했어! 올바른 방향이야! sailsjs-adapter (http://sailsjs.org/#!documenta.... 오스만과 컨셉을 확인합니다.
안녕하세요, 브렛,
이 작업에 감사드리며, @disqus_gkZwtATXIN:disqus의 의견에 전적으로 동의하며, 몽구스와의 격차를 오스만과 좁힐 수 있다면 좋을 것 같습니다. 저는 "24시간 안에 Node.js를 가르치는 샘"을 읽고 있는데, 예제 섹션에서 몽구스를 많이 사용하고 있어서 모든 것을 쉽게 사용할 수 있는 몽고DB 사용자가 부럽습니다.
그렇긴 하지만, Node.js와 Noob을 배우는 저를 용서해 주세요. 저는 현재 Node.js에서 첫 앱을 테스트하는 단계에 있기 때문에 다양한 소스에서 데이터를 추가하고 있으며 간단한 명령 하나로 특정 스키마(또는 Ottoman의 언어에서는 모델)만 삭제하는 기능을 Ottoman에서 보고 싶어요.
이해가 될지 모르겠지만 동일한 ID를 가진 여러 항목을 처리하는 방법을 테스트하고 있으며 마지막 실행에서 현재 내부에 데이터가 있으면 모든 레코드에 오류가 발생하므로 (실제로 중복되는 레코드뿐만 아니라) 깨끗한 백그라운드가 필요합니다.
CouchBase의 Node.js 커뮤니티는 아직 규모가 매우 작지만 Viber 사례에서 볼 수 있듯이 '빛'을 보고 전환하는 회사가 점점 더 많아지고 있습니다.
이 작업을 도와주셔서 감사합니다, @brettlawson:disqus!
안녕하세요, 안드레아스,
시간을 내어 의견을 공유해 주셔서 감사합니다! 카우치베이스로 완성하기 어려운 부분이 있다는 것에 동의하며, 개발자를 위해 그 격차를 해소하기 위해 열심히 노력하고 있습니다. 안타깝게도 현재로서는 데이터의 특정 하위 집합에 대한 모든 데이터를 삭제하는 것은 간단하지 않습니다(이를 허용하는 뷰를 만들 수는 있지만). 그러나 사용 사례의 경우 특정 버킷의 데이터를 완전히 삭제하는 데이터베이스의 \'flush\' 명령을 사용하거나, 테스트를 실행하는 경우에는 테스트에 사용하기에 강력한 도구이며 실제 클러스터를 사용하는 것보다 훨씬 빠른 Node.js의 모의 버전을 사용하는 것이 더 나은 해결책이 될 수 있습니다!
건배, 브렛
도움을 주셔서 감사합니다 @brettlawson:disqus와 저는 이미 FLUSH를 구현했습니다. Node.js 모형을 찾아봤는데 여러 가지가 있습니다. 항상 그렇듯이 "가장 좋은" 솔루션을 식별하기는 어렵습니다. "모의"와 관련하여 다른 솔루션보다 선호하는 솔루션이 있습니까?
안녕하세요, 브렛,
좋은 시작입니다. 제 눈에는 ODM이 Couch/Node Stack의 누락된 고리이며, Mongoose는 Couch 사용과 Mongo 사용을 점점 더 매력적이지 않은 옵션으로 만들고 있습니다.
이 프로젝트가 몽구스의 기능/견고성 수준에 도달할 가능성은 얼마나 되나요? 이 프로젝트가 CB에서 백버너 프로젝트인가요, 아니면 프론트버너 프로젝트인가요?
고마워요! CM
안녕하세요 CM!
Ottoman은 사실 이미 매우 다양한 기능을 갖추고 있지만, 아직 대부분의 기능이 문서화되지 않았습니다. 이 프로젝트는 실제로 가장 중요한 프로젝트이지만 현재 기본 클라이언트에 대한 대대적인 리팩토링이 진행 중이어서 개발이 더디고, 또한 아직 많은 사람들이 이 프로젝트에 관심을 보이지 않고 있습니다. 프로젝트에 대해 어떤 생각이 있으신가요?
건배, 브렛
Couchbase를 처음 사용하면서 몇 가지 실수를 저질렀습니다.
특히 다음과 관련하여 MongoDB에서 Couchbase로 시스템을 마이그레이션할 수 있습니다.
보기 / 색인 디자인. 누군가 도와주셨으면 합니다.
카우치베이스 교육 앱에서 이 페이지를 우연히 발견했습니다. 오스만을 추가하는 것이 합리적입니다. 관계형 세계에서 ORM 도구와 비슷한 라인 - 거의 모든 nosql DB에 필요할 것입니다. http://www.fromdev.com/2012/07…
크로스 NOSQL 호환성에 대한 계획은 어떻게 되나요? 아니면 카우치베이스에만 국한될 예정인가요?
Ottoman은 여전히 유지되고 있나요? 그렇지 않다면 NodeJS의 Couchbase에 가장 적합한 ODM은 무엇인가요?
시도해 볼 수 있는 또 다른 카우치베이스 ODM이 있습니다:
https://github.com/fogine/couc…
안녕하세요, 브렛,
저는 카우치 베이스와 오스만(Ottoman)을 처음 사용하는데, 카우치 베이스로 옮긴 이유는 그들이 지원하는 뷰 때문이었습니다. 블로그에서 오스만에서 API를 통해 카우치 베이스의 뷰와의 상호 작용을 지원한다는 글을 읽었지만 오스만에서 뷰 상호 작용에 대한 API 지원을 읽고 살펴볼 수 있는 문서로 안내해 주실 수 있나요?
고마워요
Gaurav
[...] 금주의 블로그: 카우치베이스(오스만)를 위한 Node.js ODM [...]