Looping Over a Java Object and Passing One Field to a Mongo Query Similar to SQL WHERE…IN Clause

核能气质少年 提交于 2020-02-06 07:56:10

问题


I am trying to construct a MongoDB equivalent of an SQL WHERE IN clause by iterating over a Java Object List and using one field in that list to fill in the IN data. Using generic example, I would like to build the following command in MongoDB syntax:

SELECT title FROM albums WHERE recorded_year IN ('1967','1968','1969','1970');

The SQL command IN data is extracted from the Album object recordedYear value using the following loop:

if (albums.size() <= 1000) {
    sb.append("SELECT title FROM albums WHERE recorded_year");
    sb.append(" IN (");
    for (int i = 0; i < albums.size(); i++) {
        sb.append("'");
        sb.append(albums.get(i).getRecordedYear());
        sb.append("'");
        if (i < albums.size() - 1) {
            sb.append(",");
        } else {
            sb.append(")");
        }
    }
}

Most Mongo/Java sites I visited seem to deal with command structures using hard-coded values which, while helpful, is completely impractical in real world applications. Any help in pointing to a good tutorial, or if someone has the actual code itself would be greatly appreciated.

Thanks.


回答1:


But the issue I am having is understanding how to pass a Java Object list to the to the getAllDocuments...

Make an array of elements which you want to match with the field using the in operator. For example, If you have a someObject.year field, then the array will have the year values; int [] matchYears = { 1989, 2001, 2012 }. Instead of an array you can also use a List collection.

The query:

Bson queryFilter = in("recordedYear", matchYears);
List<Document> result = new ArrayList<>();
collection.find(queryFilter).into(result);
result.forEach(System.out::println);

The queryFilter is built using the com.mongodb.client.model.Filters factory class.

The MongoDB documentation on using the $in operator.

NOTE: The int [] matchYears = { 1989, 2001, 2012 } can be also be created as int [] matchYears = { javaObject1.recorded_year, javaObject2.recorded_year, ... }.




回答2:


I didn't quite implement it with BSON, but the logic in the method appears to be working with the code below. Thank you again for your help.

public void getAlbumYears(MongoCollection<Document> collection, List<Album> albums) {

    BasicDBObject inQuery = new BasicDBObject();

    List<String> year = new ArrayList<>();

    for(Album album : albums) {
        year.add(album.getYear());
    }

    inQuery.put("year", new BasicDBObject("$in", year));

    for (Document document : collection.find(inQuery)) {
        System.out.println(document.toJson());
    }
}


来源:https://stackoverflow.com/questions/59734362/looping-over-a-java-object-and-passing-one-field-to-a-mongo-query-similar-to-sql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!