Spring Boot+MongoDB:不使用$where实现同文档两字段比较
替代MongoDB $where比较同文档字段的方案
因为启用--noscripting后无法使用服务器端JavaScript,你可以用以下几种不依赖$where的方法实现同文档两个字段的比较:
1. 使用$expr查询过滤器(MongoDB 3.6+)
$expr允许在查询过滤器中使用聚合表达式,直接引用当前文档的字段进行比较,完全不需要JS。
原生MongoDB Shell写法:
db.yourCollection.find({ $expr: { $ne: ["$a1", "$a2"] } })
Spring Data MongoDB对应写法:
如果你用的是Spring Data的Criteria,可以这样写:
// 方式1:直接构造expr Criteria criteria = Criteria.where("").expr(new Document("$ne", Arrays.asList("$a1", "$a2"))); Query query = new Query(criteria); List<YourEntity> results = mongoTemplate.find(query, YourEntity.class); // 方式2:使用AggregationExpression AggregationExpression compareFields = context -> new Document("$ne", Arrays.asList("$a1", "$a2")); Criteria criteria = Criteria.where("").expr(compareFields);
2. 使用聚合管道的$match阶段
如果需要结合其他聚合操作,也可以在聚合管道里用$match配合$expr实现:
db.yourCollection.aggregate([ { $match: { $expr: { $ne: ["$a1", "$a2"] } } }, // 后续可以添加其他聚合阶段,比如$project、$group等 ])
这些方法都完全规避了服务器端JavaScript的使用,适配--noscripting的环境。
内容的提问来源于stack exchange,提问作者gilln
相关产品推荐
相关产品推荐

