问题来源
需要在mongdb的指定集合中查询serverId字段等于mystring的信息
(——————不要被我项目复杂的数据类型吓到哦————————————)
this.mongo.getDB(params.dbName).collection<RemoteLogModel<TMsg>>(params.logName)
.find({serverId:strings})
//并不能满足当mystring为空时返回所有信息
但当string等于”“(空)时,要求返回所有的信息(不再筛选)
但是find函数只能对key值进行约束,并不能对程序变量进行约束
初步解决
进行Mongodb的查询学习,发现可以在find函数中where语句嵌套js代码
基本上就可以实现所有复杂的查询了
于是高高兴兴写下以下代码
this.mongo.getDB(params.dbName).collection<RemoteLogModel<TMsg>>(params.logName)
.find({
$where:function(){
return this.serverId==mystring||mystring=="";
}
})
如果在黑框中也就大概长这样
在黑框中测试,功能已经被满足了!!!!!!
但是呢,当我在服务器跑上述这段代码,竟然发现,这段代码跟不存在一样。。。。
where语句完全不运行。。。。。
竟然在我的服务器上失败了,也许是ts不允许这么不标准的写法吧(我猜的)
最终方案
当然,大部分人看到上面已经够用了,毕竟不是谁都要维护这么复杂的服务器
最终方案:
(find()有两个参数,query和options)先将find中的query进行构造
然后根据条件更改query!!!!
然后查询时将query注入find中就完美解决了
这种提前构造然后注入的写法应该可以让我们随心所欲地发挥了~~~~~~~~~
(当然,除了serverId,level也为空时不进行筛选)
(——————不要被我项目复杂的数据类型吓到哦————————————)
(——————看核心代码就行啦————————————)
//提前设置搜索属性
const findParams: Partial<RemoteLogModel<TMsg>> = {
serverId: params.serverId,
level: params.level as any,
};
//将不需要的属性删除
for (const key in findParams) {
if ("" == findParams[key as keyof RemoteLogModel<TMsg>]) {
delete findParams[key as keyof RemoteLogModel<TMsg>];
}
}
const logs = await this.mongo.getDB(params.dbName).collection<RemoteLogModel<TMsg>>(params.logName)
.find(findParams)
.sort({
timeMS: -1
}).skip((params.page - 1) * params.count)
.limit(params.count)
.toArray();