我有这样的文件:
{
"_id" : 1,
"time": {
"start": ISODate("2016-01-18T00:12:41.000Z"),
"end": ISODate("2016-01-18T05:12:41.000Z")
},
"subject":"javascript",
"class": "ABC"
}
...
我有客户端/服务器应用程序,客户端会向服务器发送包含四个变量的请求:timeS
,timeE
,sub
,class
。它们可能是空字符串。
在我的服务器中,如何编写聚合查询以查找与筛选条件匹配的记录?我想忽略空的搜索词。
var query = db.collection.aggregate([
{"$match": {"$and":[]}}
]);
示例:
如果timeS
不为空,我希望$match
加$eq
。
如果timeS
和timeE
都不为空,我希望$match
加$gte:timeS, $lte:timeE
。
答案 0 :(得分:1)
根据输入变量的存在动态创建匹配条件。
var matchCriteria = {}, pipeline;
var timeS, timeE, sub, clazz; //initialize them from your input
if (timeS) {
matchCriteria['time.start'] = timeS;
}
if (timeE) {
matchCriteria['time.end'] = timeE;
}
if (sub) {
matchCriteria.subject = sub;
}
if (clazz) {
matchCriteria.class = clazz;
}
pipeline = [
{
$match: matchCriteria
}
];
db.collection.aggregate(pipeline);
您可能必须执行其他检查,例如至少存在一个变量,以确保匹配标准不为空。