mongo $where的使用

本文介绍了MongoDB中使用JS脚本进行复杂查询的方法——$where操作符,并通过实例展示了如何利用这一特性来实现特定字段的比较及内嵌文档的查询。

$where ,其实就是 mongo中执行 js代码,来完成查询,直接执行脚本语言是很危险的事情,谨记谨记

不是非常必要的话 不推荐使用 $where   

1、mongo要先把数据从 bson转为js对象

2、$where 不使用索引


但不管怎么说,先达到目的吧


比如  查询 2个值相等

先find 确认一下数据库当前的数据

> db.ttt.find({})
{ "_id" : 1, "a" : 1, "b" : 1, "c" : 3 }
{ "_id" : 2, "a" : 2, "b" : 1, "c" : 3 }


可以简写为 this.a == this.b
> db.ttt.find({$where:"this.a == this.b"})
{ "_id" : 1, "a" : 1, "b" : 1, "c" : 3 }


其实就把 $where当做过滤器, 需要返回的 return true,反之则false
function a(){
	if( this.a == this.b){
		return true;
        }
	return false;
}


再插入一条 包含内嵌文档的 数据

> db.ttt.insert({"_id":3,"a":{"b":1,"c":2,"d":1}})
WriteResult({ "nInserted" : 1 })
> db.ttt.find({})
{ "_id" : 1, "a" : 1, "b" : 1, "c" : 3 }
{ "_id" : 2, "a" : 2, "b" : 1, "c" : 3 }
{ "_id" : 3, "a" : { "b" : 1, "c" : 2, "d" : 1 } }


如果直接用

function a(){
	if(this.a.b == this.a.d){
		return true;
	}
	return false;
}


> db.ttt.find({$where:"function a(){if(this.a.b == this.a.d){return true;}return false;}"})
{ "_id" : 1, "a" : 1, "b" : 1, "c" : 3 }
{ "_id" : 2, "a" : 2, "b" : 1, "c" : 3 }
{ "_id" : 3, "a" : { "b" : 1, "c" : 2, "d" : 1 } }

则不能得到想要的结果,需要其他数据没有的值进行判空

function a(){
	var x = this.a.b;
	var y = this.a.d;
	if( x == null)
		return false
	if( y == null)
		return false
	if(x == y){
		return true;
	}
	return false;
}

> db.ttt.find({$where:"function a(){var x = this.a.b;var y = this.a.d;if( x == null){return false;}if( y == null){return false;}if(x == y){return true;}return false;}"})
{ "_id" : 3, "a" : { "b" : 1, "c" : 2, "d" : 1 } }

















<think>好的,我现在需要帮助用户解决关于MongoTemplate条件查询的示例问题。用户之前提到了使用MongoTemplate进行多条件查询,现在他们希望得到具体的示例。我需要结合提供的引用内容,尤其是引用[1]、[2]、[3]和[4],来构建一个清晰的回答。首先,我应该回顾引用中的代码示例。引用[1]展示了一个基本的查询结构,使用constructQuery方法构建查询条件,然后执行find操作。引用[2]详细说明了如何整合多个条件,特别是处理同一属性的多个限制时需要使用andOperator,还涉及分页和排序。引用[3]提到了通过反射动态调用Criteria的方法,这可能对动态条件构建有帮助。引用[4]虽然包含了一个Gamma公式,但可能与当前问题无关,可以忽略。接下来,我需要组织回答的结构。用户需要示例,所以应该分步骤展示不同的查询情况。比如,基本等值查询、范围查询、组合条件、动态条件构建、分页和排序。每个部分都需要对应的代码示例,并引用相应的来源。需要注意的事项:确保所有条件查询都正确使用Criteria和Query类,特别是处理多个条件时的逻辑(如andOperator)。同时,引用正确的示例,比如在范围查询中使用gte和lte时,引用[2]中的代码。动态条件构建部分可以参考引用[3]的反射方法,但可能需要调整以更直观的方式展示,避免过于复杂。还需要检查是否有遗漏的条件类型,比如模糊查询或IN查询,这些在MongoDB中也是常见的,但用户提供的引用中没有提到,可能需要补充,但如果没有示例,可能需要避免猜测,或者简单提及。最后,生成相关问题,这些问题应围绕用户可能进一步询问的方向,比如性能优化、复杂条件处理、动态条件等,基于已有的引用内容。总结回答步骤:1.基本等值查询(引用[1])2.范围查询(引用[2]的时间范围)3.组合条件(引用[2]的andOperator)4.动态条件构建(引用[3]的反射方法调整) 5.分页和排序(引用[2]的skip、limit和Sort)6.相关问题生成确保每个代码示例正确,并正确标注引用来源。使用中文回答,保持结构清晰,示例代码正确无误。</think>### MongoTemplate条件查询示例 #### 1. 基础等值查询 ```java // 查询VINID等于指定值的文档 Query query = new Query(); query.addCriteria(Criteria.where("VINID").is("ABC123")); List<CarData> result = mongoTemplate.find(query, CarData.class); ``` > 通过`Criteria.where()`定义字段匹配条件,`.is()`表示精确匹配[^2] #### 2. 范围查询 ```java // 查询时间在[startTime, endTime]区间内的文档 Criteria criteria = Criteria.where("TIME1") .gte(startTime).lte(endTime); Query query = new Query(criteria); List<CarData> result = mongoTemplate.find(query, CarData.class); ``` > 使用`.gte()`(大于等于)和`.lte()`(小于等于)实现范围过滤[^2] #### 3. 多条件组合查询 ```java // 组合VINID匹配且状态为激活的条件 Criteria criteria = Criteria.where("VINID").is("ABC123") .and("status").is(1); Query query = new Query(criteria); ``` > 通过链式调用`.and()`实现AND逻辑组合[^1] #### 4. 同一字段多条件查询 ```java // 查询价格在100-500且评分大于4的商品 Criteria criteria = new Criteria().andOperator( Criteria.where("price").gte(100).lte(500), Criteria.where("rating").gt(4) ); Query query = new Query(criteria); ``` > 对同一字段多次限制需使用`andOperator()`包装条件[^2] #### 5. 动态条件构建 ```java public Query buildDynamicQuery(Map<String, Object> params) { Criteria criteria = new Criteria(); params.forEach((field, value) -> { if(value != null) { criteria.and(field).is(value); } }); return new Query(criteria); } ``` > 通过遍历参数Map动态添加条件[^3] #### 6. 分页排序查询 ```java Query query = new Query(criteria) .skip((pageNum-1)*pageSize) // 分页起始位置 .limit(pageSize) // 每页数量 .with(Sort.by(Sort.Direction.DESC, "createTime")); // 按时间倒序 ``` > 使用`.skip()`和`.limit()`实现分页,`.with()`添加排序规则[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值