pouchdb에서 mango query 사용하기

Mango Query는 MongoDB에 영향을 받은 DSL(Domain-Specific Language : 특수목적에 한정된 언어를 뜻하며 query나 html 태그에 이에 해당된다.)이며,  pouchdb-find 또는 find() API로 알려져 있다.

Mango Query를 사용하면 nosql에서 보다 쉽게 쿼리를 작성하고 원하는 값을 검색할 수 있다.

 

설치하기

find() API를 사용하기 위해서는 별도의 plugin을 설치해야 한다.  단, 유의할 점은 pouchdb.js가 pouchdb.find.js보다 먼저 설정이 되어야 한다.

//script tags

<script src="pouchdb.js"></script>
<script src="pouchdb.find.js"></script>

npm 설치시

>> npm install –save pouchdb-find

// in javascript

var PouchDB = require('pouchdb');
PouchDB.plugin(require('pouchdb-find'));

 

쿼리 Language

mango query를 사용하기 위해서는 index가 정의되어야 한다.

예를 들어

  1. name으로 데이터를 내림차순으로 정렬하여 가져오기
// 다른 필드로 검색하려 할 경우 index를 해당 필드로 설정해줘야 한다.
// 아래 쿼리는 name값이 null 아닌 경우에 data를 정렬한다.
db.createIndex({
 index: {fields: ['name']}
}).then(function () {
 return db.find({
 selector: {name: {$gt: null}},
 sort: ['name']
 });
});

 

2. 특정 값 이상의 데이터 가져오기

// Available selectors are $gt, $gte, $lt, $lte, $eq, $ne, $exists, $type, and more
// debut 년도가 1990년 이후인 data를 불러오는 쿼리

db.createIndex({
 index: {fields: ['debut']}
}).then(function () {
 return db.find({
 selector: {debut: {$gte: 1990}}
 });
});

3. 특정 값과 일치하는  데이터 가져오기

// series라는 필드의 값에 'Mario'가 포함된 데이터를 series와 debut의 역순으로 가져오기
db.createIndex({
 index: {fields: ['series', 'debut']}
}).then(function () {
 return db.find({
 selector: {series: {$eq: 'Mario'}},
 sort: [{series: 'desc'}, {debut: 'desc'}]
 });
});

4. 특정 field의 데이터만 가져올 경우

// '_id'와 'debut' 필드값만 가져오는 경우

db.createIndex({
 index: {fields: ['debut']}
}).then(function () {
 return db.find({
 selector: {debut: {$gt: null}},
 fields: ['_id', 'debut'],
 sort: ['debut']
 });
});

5. Pagination

// name 필드를 기준으로 한페이지를 10건씩 했을때 첫페이지를 가져오는 경우

db.createIndex({
 index: {fields: ['name']}
}).then(function () {
 return db.find({
 selector: {name: {$gte: null}},
 fields: ['_id', 'name'],
 sort: ['name'],
 limit:10
 });
});

//다음 페이지를 가져오는 경우 여기서의 joy는 첫페이지 맨 마지막 사람의 name
db.createIndex({
 index: {fields: ['name']}
}).then(function () {
 return db.find({
 selector: {name: {$gt: 'joy'}},
 fields: ['_id', 'name'],
 sort: ['name'],
 limit:10
 });
});

 

 

Share