我正在使用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}}}}}}}}}}

09-27 15:21