我正在使用Java和MongoDb 3.0,并且有一个查询想要转换为Java代码。
Mongo DB查询如下:
db.users.find({ $or: [ { updated_at:{ $gt:90, $lte:200}}, { updated_at:{ $gt:350, $lte:400}}, { updated_at:{ $gt:560, $lte:700}} ] })
Java Query如下所示。
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,最后一个值如下[Document {{received_at_server = Document {{$ 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}}}}]]
最佳答案
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.上面的“与”操作列表的“或”操作。
greaterQuery.put("updated_at", gEQuery);
lessQuery.put("updated_at", lEQuery);
orqueryList.add(greaterQuery);
orqueryList.add(lessQuery);
}
query.put("$or", orqueryList);
您上面的Java代码仅检查OR条件(列表或queryList)。您正在将$ 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)
文档{{$ or = [文档{{$ and = [文档{{updated_at =文档{{$ gte = 90}}}}},
文档{{updated_at =文档{{$ lte = 200}}}}}}},
文档{{$ and = [Document {{updated_at = Document {{$ gte = 350}}}}},
文档{{updated_at =文档{{$ lte = 400}}}}}}},
文档{{$ and = [Document {{updated_at = Document {{$ gte = 560}}}}},
文档{{updated_at =文档{{$ lte = 700}}}}}}}}}}