我正在研究java和MongoDb 3.0并且有一个我想要转换成java代码的查询。
Mongo数据库查询如下:
db.users.find({ $or: [ { updated_at:{ $gt:90, $lte:200}}, { updated_at:{ $gt:350, $lte:400}}, { updated_at:{ $gt:560, $lte:700}} ] })
Java查询就像下面这样。
List<Document> orqueryList = new ArrayList<Document>();
List<String> list1 = new ArrayList<String>();
list1.add("90:200");
list1.add("350:400");
list1.add("560:700");
Document greaterQuery = new Document();
Document lessQuery = new Document();
Document lEQuery = new Document();
Document gEQuery = new Document();
for (String time : list1) {
String[] updatedAtt = tim.split(":");
gEQuery.put("$gte", Long.parseLong(updatedAtt[0]));
lEQuery.put("$lte", Long.parseLong(updatedAtt[1]));
greaterQuery.put("updated_at", gEQuery);
lessQuery.put("updated_at", lEQuery);
orqueryList.add(greaterQuery);
orqueryList.add(lessQuery);
}
query.put("$or", orqueryList);
但这不起作为我的orqueryList
列表给我的大小3,其最后一个值如下
[文献{{received_at_server =文档{{$ GTE = 560}}}}, 文献{{received_at_server =文档{{$ LTE = 700}}}}, 文献{{received_at_server =文档{{$ GTE = 560}}}}, 文献{{received_at_server =文档{{$ LTE = 700}}}}, 文献{{received_at_server =文档{{$ GTE = 560}}}}, 文献{{received_at_server =文档{{$ LTE = 700}}}}]
答案 0 :(得分:1)
db.users.find({ $or: [ { updated_at:{ $gt:90, $lte:200}}, { updated_at:{ $gt:350, $lte:400}}, { updated_at:{ $gt:560, $lte:700}} ] })
查询分为两部分 - 1.对updated_at值$ gt和$ lte的AND操作 2.上述AND操作列表的OR操作。
greaterQuery.put("updated_at", gEQuery);
lessQuery.put("updated_at", lEQuery);
orqueryList.add(greaterQuery);
orqueryList.add(lessQuery);
}
query.put("$or", orqueryList);
您的上述Java代码仅检查OR条件(列表orqueryList)。您正在将OR gt和$ lte条件添加到OR条件本身。
尝试以下逻辑:
Document query = new Document();
List<String> list1 = new ArrayList<String>();
List<Document> andQueryList = new ArrayList<Document>();
list1.add("90:200");
list1.add("350:400");
list1.add("560:700");
for (String time : list1) {
String[] updatedAtt = time.split(":");
andQueryList.add(new Document("$and", Arrays.asList(new Document("updated_at", new Document("$gte", Long.parseLong(updatedAtt[0]))),
new Document("updated_at", new Document("$lte", Long.parseLong(updatedAtt[1]))))));
}
query.put("$or", andQueryList);
查询输出如下(相当于Mongo Query)
文献{{$或= [{文献{$和= [文献{{的updated_at =文档{{$ GTE = 90}}}}, 文献{{的updated_at =文档{{$ LTE = 200}}}}]}}, 文献{{$和= [文献{{的updated_at =文档{{$ GTE = 350}}}}, 文献{{的updated_at =文档{{$ LTE = 400}}}}]}}, 文献{{$和= [文献{{的updated_at =文档{{$ GTE = 560}}}}, 文献{{的updated_at =文档{{$ LTE = 700}}}}]}}]}}