将MongoDB3.0查询转换为java

时间:2016-04-15 07:19:55

标签: java mongodb mongodb-query mongo-java

我正在研究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}}}}]

1 个答案:

答案 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}}}}]}}]}}