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가 정의되어야 한다.
예를 들어
- 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
});
});