Spring Boot и Mongo — как запрашивать по вложенному свойству

У меня следующая проблема - как сделать запрос по вложенному свойству с @Query?

Мой класс продукта (документ на монго):

@Document(collection = "products")
public class Product {

    @Id
    private String id;

    @DBRef
    private ProductProperties properties;

Как это выглядит в монго:

{
    "_id" : ObjectId("5d5e78d20e8e3d0006079a84"),
    "companyId" : "1234",
    "properties" : {
        "$ref" : "properties",
        "$id" : ObjectId("5df8dd2331ea7b4a9384335b")
    },
    "calendar" : [ 
        {
            "startDate" : ISODate("2019-09-04T22:00:00.000Z"),
            "endDate" : ISODate("2019-09-09T22:00:00.000Z")
        }
    ],
    "_class" : "org.abc.def"
}

Класс ProductProperties (документ на монго):

    @Document(collection = "product_properties")
    public class ProductProperties {
        @Id
        private String id;
(...)

Как это выглядит в монго:

   {
    "_id" : ObjectId("5df8dd2331ea7b4a9384335b"),
    "brand" : "offer Brand_1",
    "model" : "offer model_1",
    "modelNumber" : "offer model number_1",
    "size" : {
    ...
}

Мой репозиторий Spring:

public interface ProductRepository extends MongoRepository<Product, String> {

    @Query("{'properties.id': ?0 }")
    List<Product> findByPropertiesId(String propertiesId);

Я также пробовал:

List<Product> findByProperties_id(String propertiesId)

or

@Query("{'properties.$id': ?0 }")
        List<Product> findByPropertiesId(ObjectId propertiesId);

но БЕЗ УСПЕХА. Вы знаете, что не так?

Когда я вызываю:

public List<Product> findProductsByPropertiesId(String properties) {
        if (properties == null) {
            throw new IllegalArgumentException("onFind: propertiesId should not be null.");
        }
        return productRepository.findByProperties_Id(properties);
    } 

Я получаю пустой список :(

Может быть, через Query это сделать невозможно?


person Matley    schedule 21.01.2020    source источник
comment
Вот несколько ответов с соответствующими вопросами. См. данные весны - Mongodb - метод findBy для вложенных объектов и MongoDb Spring находит во вложенном объекте.   -  person prasad_    schedule 22.01.2020
comment
К сожалению, я так и не решил свою проблему. Я думаю, что перепробовал все варианты... безуспешно :(   -  person Matley    schedule 23.01.2020
comment
Они не будут работать в вашем случае. Вы используете @DBRef в классе Product. См. этот пост об использовании @DBRef: Spring Mongo DB @DBREF. Что такое ссылка на базу данных? См. DBRefs в документации MongoDB.   -  person prasad_    schedule 23.01.2020
comment
Все еще не работает. Я добавил свойства: {$ref: properties, $id: ObjectId(5df8dd2331ea7b4a9384335b)} в свой JSON. Мой репозиторий выглядит так: @Query(value = {'properties.id': ?0}) List‹Product› findByPropertiesId(String propertiesId);   -  person Matley    schedule 24.01.2020
comment
Все еще не работает...: Пожалуйста, опубликуйте точные данные и код, с которым вы работаете, в сообщении. Четко укажите, с какой ошибкой или проблемой вы столкнулись.   -  person prasad_    schedule 24.01.2020
comment
@prasad_ Все написано в этом посте выше. Что еще я должен добавить? Я не получаю никаких ошибок, просто вызов productRepository.findByProperties_Id(properties) возвращает пустой список. См. мой обновленный контент выше, я добавил вызов функции репозитория.   -  person Matley    schedule 25.01.2020
comment
Я не знаю, в чем проблема. Есть довольно много связанных сообщений как на StackOverflow, так и на других сайтах. Пожалуйста, попробуйте найти Spring MongoDB @DBRef. Только предложение: один из способов решить проблему — попытаться запустить пример самостоятельно, и таким образом вы сможете начать с работающего кода и в дальнейшем применить его к своей ситуации.   -  person prasad_    schedule 26.01.2020
comment
Да, я знаю, это хороший подход... Но я думаю, что перепробовал все... Но когда вы говорите, что можно найти по идентификатору вложенного объекта, я не могу сдаться... Я должен найти решение   -  person Matley    schedule 30.01.2020
comment
@Matley Вы нашли решение своей проблемы? Если да, не могли бы вы поделиться им с нами?   -  person user1419243    schedule 15.01.2021


Ответы (1)


person    schedule
comment
Пожалуйста, найдите минутку, чтобы отредактировать свой ответ, включив в него некоторые пояснения, а не просто блок кода. Это поможет ОП и будущим читателям понять почему, а не только как. Такие вопросы, как правило, со временем становятся более полезными и с большей вероятностью будут признаны положительными. - person Jeremy Caney; 26.07.2021