TS+Mongodb高级查询,$where和提前构造query

TS+Mongodb高级查询 ,两种方法

问题来源

需要在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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值