728x90
반응형
전 글에서 schemas 파일까지 다루어보았다.
이번 글에선 대망의query.js를 다루어보겠다.
1. 전체코드
const mongoose = require('mongoose');
const { Schema } = mongoose;
const { WORKER, COLLECTION_NAME, QUERY } = require('../const/consts'); //consts 파일들
const Schemas = require('./schemas')
const { Worker } = Schemas; // 몽구스 model 파일들
exports.modelQuery = async (query,collection,doc,option) => {
var doc = doc;
var Collection = Schemas[collection];
// console.log(Collection.prototype.schema.options.collection);
var option = option;
var one;
var postJob; // 임의로 지정해줄 수도 있고, option으로 받아올 수도 있음 (부가적인 함수)
if(option.postJob) {
postJob = option.postJob;
}
var resResult = (result) => { //함수가 끝나고 실행되는 콜백함수
if (postJob != null) {
postJob();
}
return result;
};
if ( query == QUERY.Aggregate) {
var aggregatearray = [];
switch (collection) {
case COLLECTION_NAME.Alarm :
break;
case COLLECTION_NAME.Car :
break;
}
if(doc != undefined) {
if (doc.addFields) {
aggregatearray.push({$addFields : doc.addFields});
}
if (doc.lookup) {
aggregatearray.push({$lookup : doc.lookup});
}
if (doc.unwind) {
aggregatearray.push({$unwind : doc.unwind});
}
if (doc.match) {
aggregatearray.push({$match : doc.match});
}
if (doc.project) {
aggregatearray.push({$project : doc.project});
}
if (doc.sort) {
aggregatearray.push({$sort : doc.sort});
}
if (doc.limit) {
aggregatearray.push({$limit : doc.limit});
}
}
if (Object.keys(option).length != 0) {
if (option.limit) {
}
if (option.sort) {
}
}
else {
var one = await Collection.aggregate([aggregatearray]).then(resResult);
}
return one;
}
};
원래는 각 쿼리별 조건문이 다 들어있으나, 결국 방식은 비슷하기 때문에 mongoose의 쿼리문인 aggregate만 예시로 들었다. 방식은 전에 정의해두었던 consts 파일에서 사용할 schema(열거체)와 query, collection_name를 가져오고 모델을 미리 정의해두었던 schema(모델)을 가져온다.
그 다음 modelquery 함수를 정의하고, 인자 값을 query, collection, doc, option을 설정해서 어떤 스키마, 어떤 쿼리, 어떤 데이터가 들어오든 쿼리가 실행이 가능하도록 한다.
실제로 라우터에선
//Schemas
const {modelQuery} = require('../schemas/query')
const {COLLECTION_NAME, QUERY} = require('../const/consts');
이 것만 위에 선언을 해주고
const agents = await modelQuery(QUERY.Findone,COLLECTION_NAME.Company,{ "CNU" : CNU+"000" },{});
이방식대로 써주면 JQuery 뿐만 아니라 React.js_node.js(Back-end), Graphql에서도 활용이 가능하다.
NoSQL이 아닌 SQL 또한 node js sequelize를 사용 할 때 모델을 지정해주는 방법만 바꿔주면 활용이 가능하다.
이 방법이 성공했을 때 진심으로 전율을 느꼈다..
728x90
반응형
'DB > MongoDB' 카테고리의 다른 글
MongoDB | Schemas(2) (0) | 2021.09.14 |
---|---|
MongoDB | Schemas(1) (0) | 2021.09.14 |
MongoDB | Consts 만들기 (0) | 2021.09.14 |
MongoDB | 설치하기, 삭제하기 (0) | 2021.09.14 |