mongodbrelation
Version:
ONE_TO_MANY, MANY_TO_ONE, ONE_TO_ONE, MANY_TO_MANY realtionships among diffrent collections in mongodb
89 lines (88 loc) • 3.4 kB
JavaScript
const JOIN_TYPE_ENUM = {
ONE_TO_ONE: 1,
ONE_TO_MANY: 2,
MANY_TO_MANY: 3,
MANY_TO_ONE: 4
}
module.exports = {
joinedQuery : function (condition,joinCollectionName, joinFieldName, foreignFieldName, aliasname, outputfields, typeofJoin) {
let error = null;
if (!joinCollectionName && !joinFieldName && !foreignFieldName && !outputfields && !typeofJoin) {
error = new Error();
error.name = 'invalid input';
error.message = "please pass mandatory fields";
}
if (!JOIN_TYPE_ENUM.hasOwnProperty(typeofJoin)){
error = new Error();
error.name = 'invalid input';
error.message = "please pass proper typeofJoin";
}
if (error) {
throw error;
return 0;
}
let query = [];
let lookupparentjson = {$lookup: null};
let lookupjson = {from: '', localField: '', foreignField: '', as: '' };
let unwindparentjson = {$unwind: null};
let projectparentjson = {$project: null};
if (condition) {
let matchparentjson = {$match: null};
matchparentjson.$match = condition;
query.push(matchparentjson);
}
try {
switch (JOIN_TYPE_ENUM[typeofJoin]) {
case 1:
lookupjson.from = joinCollectionName;
lookupjson.localField = joinFieldName;
lookupjson.foreignField = foreignFieldName;
lookupjson.as = aliasname;
lookupparentjson.$lookup = lookupjson;
query.push(lookupparentjson);
unwindparentjson.$unwind = '$'+aliasname;
query.push(unwindparentjson);
break;
case 2:
lookupjson.from = joinCollectionName;
lookupjson.localField = joinFieldName;
lookupjson.foreignField = foreignFieldName;
lookupjson.as = aliasname;
lookupparentjson.$lookup = lookupjson;
query.push(lookupparentjson);
// unwindparentjson.$unwind = '$'+aliasname;
// query.push(unwindparentjson);
break;
case 3:
lookupjson.from = joinCollectionName;
lookupjson.localField = joinFieldName;
lookupjson.foreignField = foreignFieldName;
lookupjson.as = aliasname;
lookupparentjson.$lookup = lookupjson;
query.push(lookupparentjson);
break;
case 4:
lookupjson.from = joinCollectionName;
lookupjson.localField = joinFieldName;
lookupjson.foreignField = foreignFieldName;
lookupjson.as = aliasname;
lookupparentjson.$lookup = lookupjson;
query.push(lookupparentjson);
unwindparentjson.$unwind = '$'+aliasname;
query.push(unwindparentjson);
break;
}
if (outputfields) {
projectparentjson.$project = outputfields;
query.push(projectparentjson)
}
// push look up
// push unwind if applicable
// push project fields
return query;
} catch (e) {
throw e;
return 0;
}
}
}