node.js – Mongoose如何用if条件写一个查询?

假设我有以下查询

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);
    });

};

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...