猫鼬如何使用 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.getMonth(), 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)
]
},
1,
0
]
}
},
thirtyDaysAgo: {
$sum: {
$cond: [
{
$lte: [
"$publishDate",
new Date(queryData.dateGroups.oneMonthAgo)
]
},
1,
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 if 条件的东西来检查变量是否存在并且不为空,然后包含一个查询子句。有可能做到吗?

我的示例数据如下:

/* 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,
"isPublished" : true,
"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",
"number" : 4,
"isPublished" : true,
"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",
"position" : "Software Developer",
"number" : 5,
"isPublished" : true,
"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
},
{
$group: {
_id: null,
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]
},
1,
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);
});
};

据我了解,我可以建议您遵循一般查询。根据需要修改此设置。

db.getCollection('vacancy')
.aggregate([{$match: { $and: [ 
{publishDate:{ $gte: new Date(2017, 4, 13) }} , 
{publishDate:{ $lte: new Date(2017, 4, 14) }}
]} }])

总结:

  • 用于匹配以过滤掉结果。
  • 我们正在使用聚合管道,
  • 因此您可以在管道中添加更多聚合运算符
  • 使用$and执行逻辑 AND,因为我们想在给定范围(例如 1 天、2 天或 1 个月)之间获取一些文档(根据您的要求更改日期参数)

相关内容

  • 没有找到相关文章

最新更新