假设我有以下查询:
post.getSpecificDaterangeJobs = function(queryData,callback) { var matchCriteria = queryData.matchCriteria; var currentDate = new Date(); var match = { expireDate: { $gte: new Date(currentDate.getFullYear(),currentDate.getMonth(),currentDate.getDate()) } }; if (queryData.matchCriteria !== "") { match = { expireDate: { $gte: new Date(currentDate.getFullYear(),currentDate.getDate()) },$text: { $search: matchCriteria } }; } var pipeline = [ { $match: match },{ $group: { _id: null,thirtyHourAgo: { $sum: { $cond: [ { $gte: [ "$publishDate",new Date(queryData.dateGroups.thirtyHourAgo) ] },1,0 ] } },fourtyEightHourAgo: { $sum: { $cond: [ { $gte: [ "$publishDate",new Date(queryData.dateGroups.fourtyHourAgo) ] },thirtyDaysAgo: { $sum: { $cond: [ { $lte: [ "$publishDate",new Date(queryData.dateGroups.oneMonthAgo) ] },0 ] } } } } ]; var postsCollection = post.getDataSource().connector.collection( post.modelName ); postsCollection.aggregate(pipeline,function(err,groupByRecords) { if (err) { return callback("err"); } return callback(null,groupByRecords); }); };
我想做的是:
1-检查queryData.dateGroups.thirtyHourAgo是否存在且具有值,然后仅在查询中添加相关匹配子句(仅过去30小时的帖子数).
2-检查queryData.dateGroups.fourtyHourAgo是否存在,然后添加相关查询部分(过去30小时和过去48小时前的帖子数).
3和queryData.dateGroups.oneMonthAgo相同(过去30小时,48小时和过去一个月的帖子数).
我需要类似MysqL的东西,如果条件检查变量是否存在而不是空,则包含查询子句.有可能吗?
我的示例数据如下:
/* 1 */ { "_id" : ObjectId("58d8bcf01caf4ebddb842855"),"vacancyNumber" : "123213","position" : "dsfdasf","number" : 3,"isPublished" : true,"publishDate" : ISODate("2017-03-11T00:00:00.000Z"),"expireDate" : ISODate("2017-05-10T00:00:00.000Z"),"keywords" : [ "dasfdsaf","afdas","fdasf","dafd" ],"deleted" : false } /* 2 */ { "_id" : ObjectId("58e87ed516b51f33ded59eb3"),"vacancyNumber" : "213123","position" : "Software Developer","number" : 4,"publishDate" : ISODate("2017-04-14T00:00:00.000Z"),"expireDate" : ISODate("2017-05-09T00:00:00.000Z"),"keywords" : [ "adfsadf","dasfdsaf" ],"deleted" : false } /* 3 */ { "_id" : ObjectId("58eb5b01c21fbad780bc74b6"),"vacancyNumber" : "2432432","position" : "Web Designer","publishDate" : ISODate("2017-04-09T00:00:00.000Z"),"expireDate" : ISODate("2017-05-12T00:00:00.000Z"),"keywords" : [ "adsaf","das","fdafdas","fdas" ],"deleted" : false } /* 4 */ { "_id" : ObjectId("590f04fbf97a5803636ec66b"),"vacancyNumber" : "4354","number" : 5,"publishDate" : ISODate("2017-05-19T00:00:00.000Z"),"expireDate" : ISODate("2017-05-27T00:00:00.000Z"),"keywords" : [ "PHP","MysqL" ],"deleted" : false }
假设我的应用程序界面中有三个链接:
1- 30小时前的帖子.
2- 48小时前的帖子.
3-最后一个月的帖子.
现在,如果用户点击第一个链接我应该控制只在30小时前对帖子进行分组,但是如果用户点击第二个链接,我应该准备我的查询将帖子分组30小时和48小时,如果用户点击第三个链接我应该准备好所有这些.
我想要的东西:
var pipeline = [ { $match: match },if (myVariable) { thirtyHourAgo: { ........ ........ } } if (mysecondVariable) { fortyEightHourAgo: { ........ ........ } }
解决方法
您可以使用javascript根据查询参数动态创建json文档.
您更新的功能看起来像
post.getSpecificDaterangeJobs = function(queryData,callback) { var matchCriteria = queryData.matchCriteria; var currentDate = new Date(); // match document var match = { "expireDate": { "$gte": currentDate } }; if (matchCriteria !== "") { match["$text"]: { "$search": matchCriteria } }; // group document var group = { _id: null }; // Logic to calculate hours difference between current date and publish date is less than 30 hours. if (queryData.dateGroups.thirtyHourAgo) { group["thirtyHourAgo"] = { "$sum": { "$cond": [{ "$lte": [{ "$divide": [{ "$subtract": [currentDate,"$publishDate"] },1000 * 60 * 60] },30] },0 ] } }; } // Similarly add more grouping condition based on query params. var postsCollection = post.getDataSource().connector.collection( post.modelName ); // Use aggregate builder to create aggregation pipeline. postsCollection.aggregate() .match(match) .group(group) .exec(function(err,groupByRecords) { if (err) { return callback("err"); } return callback(null,groupByRecords); }); };
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。