mongo实现数据查询的自比较

本文介绍在MongoDB中如何利用$expr和$where进行字段间的比较查询,包括在不同版本下的使用方法及性能对比,特别强调了3.6版本以上$expr的高效性和对count函数的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求是这样的,我想要在一个集合中查询出我需要的数据,约束条件中,这条数据的某个字段的值与自身的另外一个字段数据进行比较,满足判断等式的数据返回。

对应的SQL

select count(1) from hello where field1>field2

如果是老司机知道如何查询的话,那就不用往下看了!

$where

在mongo3.6以下可以使用$where来达到目的,对应的写法是 

db.hello.find({$where:'this.field1>this.field2'})
db.hello.find({$where:function(){return this.field1>this.field2}})

需要注意的是$where​​​​​​​本身不能使用count,会报错 $where​​​​​​​is not allowed in this context,此处上下文不允许使用 $where​​​​​​​,如果要达到统计多少条的目的,查询出来之后,判断长度,可以在options选项中设置只返回的_id以减少传输的数据量,提高查询效率。

db.hello.find({$where:'this.field1>this.field2'},{_id:1})
db.hello.find({$where:function(){return this.field1>this.field2}},{_id:1})

一个非常大的问题是$where​​​​​​​本身是逐条执行js语句,this就是游标指向的当前行。那么问题来了$where​​​​​​​​​​​​​​会不会走组合索引了?如果我在field1,field2上建立一个联合索引,那么使用$where​​​​​​​会不会走索引了?个人猜测是会的

$expr

在mongo3.6版本以上,可以使用这个$expr。效率高于$where,原因在于不执行js语句。另外$expr不支持多键索引,mongo在建议索引时,如果你的字段类型是数组,那么mongo会为数组中的每个元素建立索引,这样的索引称为多建索引。对于的具体查询语句是

db.hello.find({$expr:{$gt:['$field1','$field2']}}).count()        

使用$expr是支持count函数的。除此以外,还可以对字段带条件的处理。$expr

db.supplies.find( {
    $expr: {
       $lt:[ {
          $cond: {
             if: { $gte: ["$qty", 100] },
             then: { $divide: ["$price", 2] },
             else: { $divide: ["$price", 4] }
           }
       },
       5 ] }
} )

 

MongoRepository 是 Spring Data MongoDB 提供的一种 Repository 接口,用于简化 MongoDB 数据库的操作。 要实现分页查询,可以使用 MongoRepository 接口提供的一些分页查询方法,例如: ```java public interface UserRepository extends MongoRepository<User, String> { Page<User> findAll(Pageable pageable); Page<User> findByAgeGreaterThan(int age, Pageable pageable); // 其他自定义查询方法 } ``` 其中,`Pageable` 是 Spring Data 提供的一个分页请求参数接口,包含了分页查询的页码、每页数据量、排序方式等信息。 使用时,可以将 `Pageable` 对象作为参数传入分页查询方法中: ```java Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by("age").descending()); Page<User> users = userRepository.findByAgeGreaterThan(18, pageable); ``` 上述代码中,`PageRequest.of()` 方法用于创建 `Pageable` 对象,包含了当前页码、每页数据量和按年龄倒序排序的排序方式,然后调用 `findByAgeGreaterThan()` 方法进行分页查询。 查询结果为 `Page<User>` 类型,包含了当前页的数据和总页数等信息。可以通过 `Page` 对象的方法获取分页信息: ```java users.getContent(); // 当前页的数据列表 users.getTotalElements(); // 总数据量 users.getTotalPages(); // 总页数 users.getNumber(); // 当前页码 users.getSize(); // 每页数据量 users.hasNext(); // 是否有下一页 users.hasPrevious(); // 是否有上一页 ``` 以上就是使用 MongoRepository 实现分页查询的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值