关于使用mongoDB进行查询条件组装时报错

一 、项目场景:

关于使用mongoDB进行查询条件组装时报错:Due to limitations of the BasicDBObject, you can’t add a second ‘$and’ 和Due to limitations of the com.mongodb.BasicDBObject, you can’t add a second ‘time’ criteria的问题。

二、 问题描述

一、关于you can’t add a second ‘time’ criteria的问题。
因为项目需求,我需要对mongo中的time进行不同条件的查询,因之前一直使用MySQL,所以错误的认为MySQL的语法,在mongo中其实也是可以使用的,但当报错,出现问题之后,才发现,mongo的语法在Java中与MySQL还是有一些区别的。

在这里插入图片描述在这里插入图片描述在这里插入图片描述因为这三个条件都需要对mongo中的time字段,进行查询筛选,但是在mongo中,对与同一个字段的查询,无法直接使用query.addCriteria进行连接,所以这里就会出现一个问题,由于mongo语法限制,你无法增加两个time的查询条件,所以就是导致前端在进行查询的时候**,出现问题:**Due to limitations of the com.mongodb.BasicDBObject, you can’t add a second ‘time’ criteria正确的写法应该如上图一样。

二、Due to limitations of the BasicDBObject, you can’t add a second ‘$and’

但是当你使用mongo中的andOperator去连接查询条件时,又会衍生出另一个问题: you can’t add a second ‘$and’**
这个问题在于:无效使用 MongoDB Api 的异常:由于 BasicDocument 的限制,不能添加第二个 $and 表达式… ,也就是说 andOperator 只能出现一次调用,不能够出现两次的 andOperator 调用!
所以就导致了
在这里插入图片描述

在这里插入图片描述我这两个查询条件无法共用的问题!在查询了相关博客和文档后,发现这个问题时mongoApi语法上的限制,在对同一个字段进行查询的时候,你必须使用andOperator 去连接多个同一字段的查询,但是蛋疼的点就在于,api中andOperator 只能使用一次,一次!如果多次使用就会出现异常。所以最后对于我这个问题,只能说在前端进行限制,两个条件只让用户使用一个,如果选择了其中一个,那么另一个查询条件就无法使用。

正确的使用其实就是:
根据三个或者三个以上的筛选条件对某个字段进行查询时,虽然只能使用一次 andOpeator 显式调用,但是可以将多个条件放在一个 addOperator 中包裹起来,如下所示

    query.addCriteria(new Criteria().andOperator(
                    Criteria.where("time").lt(resultDate)
                    , Criteria.where("dataList").ne(null).ne(new Document())));

但是由于我的业务需求,我没办法将这两个查询条件进行包裹,因此只能在业务查询上进行限制。
同理,如果你在使用or的时候,如果多次使用也会出现这种问题。

三、总结

MongoDB和MySQL是两种不同的数据库管理系统,它们在Java中使用的语法有所不同。所以在使用的时候,不要有先入为主的观念,不然总会出现各种问题。
如 MongoDB:
使用$and操作符连接查询条件。例如:

MongoCollection<Document> collection = database.getCollection("users");
// 使用and连接查询条件
Document queryAnd = new Document("$and", Arrays.asList(new Document("name", "John"), new Document("age", 30), new Document("city", "New York")));
collection.find(queryAnd).forEach(printBlock);

使用$or操作符连接查询条件。例如:

MongoCollection<Document> collection = database.getCollection("users");
// 使用or连接查询条件
Document queryOr = new Document("$or", Arrays.asList(new Document("name", "John"), new Document("age", 30), new Document("city", "New York")));
collection.find(queryOr).forEach(printBlock);

使用多个查询条件。例如:

MongoCollection<Document> collection = database.getCollection("users");
// 使用多个查询条件
Document queryMultiple = new Document("name", "John").append("age", 30).append("city", "New York");
collection.find(queryMultiple).forEach(printBlock);

MySQL:
使用SQL语句中的AND关键字连接查询条件。例如:

// 使用and连接查询条件
String queryAnd = "SELECT * FROM users WHERE name = 'John' AND age = 30 AND city = 'New York'";
PreparedStatement andStatement = connection.prepareStatement(queryAnd);
ResultSet andResultSet = andStatement.executeQuery();

使用SQL语句中的OR关键字连接查询条件。例如:

// 使用or连接查询条件
String queryOr = "SELECT * FROM users WHERE name = 'John' OR age = 30 OR city = 'New York'";
PreparedStatement orStatement = connection.prepareStatement(queryOr);
ResultSet orResultSet = orStatement.executeQuery();

可以看出其实还是有很大区别的。

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值