весенние данные для mongodb с поиском на основе карты

Spring data предлагает различные репозитории для CRUD, подкачки и сортировки для mongodb. Когда нам нужен документ из mongodb с использованием различных атрибутов, мы склонны писать метод findBy или метод с явным запросом, аннотированным @Query. Но если мой документ имеет много свойств, и мне нужны различные средства для извлечения документа, предлагает ли Spring «метод репозитория», который принимает карту атрибутов и значений? Написание различных findBy может быть громоздким. Использование QueryDSL кажется быть вариантом, но требует генерации кода и изменений build.gradle. Я могу использовать QueryDSL, если решение на основе карты недоступно.

Например:

class FooDocument {
    String id ;//mongodb ObjectId
    String name
    String version
    boolean deleteIndicator
    ... any more attributes
}

Нужен метод в репозитории, например

 List<FooDocument> findByMap ( Map attrValMap );

Вызовите метод (groovy)

repository.findByMap ( [ "name" : "fooname", "version" : "1.0" ] )
repository.findByMap ( [ "name" : "fooname"] )
repository.findByMap ( [ "version" : "1.0", "deleteIndicator" : false] )

Я готов написать этот метод, используя комбинацию Criteria/Query или выборку на основе BasicDBObject с использованием интерфейса MongoOperations, если данные Spring не предлагают это из коробки.


person suman j    schedule 02.04.2014    source источник


Ответы (1)


Я не уверен, что Spring Data может сделать это легко. Но если вы хотите использовать BasicDBObject MongoDB для получения того, что вам нужно, вы можете использовать его следующим образом:

BasicDBObject doc = new BasicDBObject("name", "fooname").append("version", "1.0");
DBCursor cursor = find(doc);
List<FooDocument> fooDocList = new ArrayList<FooDocument>();
while (cursor.hasNext()) { 
    DBObject obj = cursor.next(); 
    FooDocument foo = mongoTemplate.getConverter().read(FooDocument.class, obj);  
    fooDocList.add(foo); 
}
person tonga    schedule 02.04.2014
comment
Вариант запроса кажется проще. Я могу объявить метод findByQuery(Query query) в репозитории и предоставить пользовательскую реализацию этого метода, которая делегирует вызов MongoOperations#methods, которые принимают экземпляр Query. Мне не нужно возиться с итерацией и выборкой. Но надеялся, что репозиторий Spring предоставит такую ​​​​функциональность из коробки для mongodb. - person suman j; 02.04.2014