Как получить поля указанного объекта из массива в Spring Mongo, используя интерфейс MongoRepository - PullRequest
0 голосов
/ 06 декабря 2018

Json Object

{
    "_id" : ObjectId("5c07afde9bc2e9ab1dfb6c01"),
    "rates" : [ 
        {
            "day" : "Mon",
            "start" : "0900",
            "end" : "1800",
            "found " : "active"
        }, 
        {
            "day" : "Tue",
            "start" : "1800",
            "end" : "0900",
            "found " : "inactive"
        }, 
        {
            "day" : "Fri",
            "start" : "1800",
            "end" : "0900",
            "found " : "inactive"
        }
    ]
}

Я использовал ссылку ниже, чтобы получить один из объектов из массива:

получить указанные поля из массива

Когда я запрашиваю как

myRepositroy.findByDayAndTime("Fri"));
public MyStatus findByDayAndTime(String day) {
// i get required object 
Query query = new Query();
        query.addCriteria(Criteria.where("rates.day").is(day));
        query.fields().include("rates.$");

return mongoTemplate.find(query, MyStatus.class);
}

Вызов хранилища для поиска требуемого объекта из массива с несколькими полями

myRepositroy.findByDayAndTime("Fri","1800"));

Ниже приведен метод, используемый для запросов к нескольким полям, например

public MyStatus findByDayAndTime(String day,String start) {
 Query query = new Query();            
query.addCriteria(Criteria.where("rates.day").is(day).and("rates.start").is(start));

        query.fields().include("rates.$");

        return mongoTemplate.find(query, MyStatus.class);
    }

но я получаю в качестве выходного 2-го объекта индексного массива вместо 3-го объекта индексного массива.

Как получить единственный требуемый объект из массива, используя запрос со значениями вроде ("Fri", "1800 ")

1 Ответ

0 голосов
/ 16 декабря 2018

Проблема в запросе.Просто замените этот код

public MyStatus findByDayAndTime(String day,String start) {
  Query query = new Query();            
  query.addCriteria(Criteria.where("rates").elemMatch(Criteria.where("day").is(day).and("start").is(start)));

  query.fields().include("rates.$");

  return mongoTemplate.find(query, MyStatus.class);
}

Это работает для меня.Хорошо, что с официальным документом mongodb doc Оператор проекции

...