Подтвердить что ты не робот

MongoDB: найти поддокумент в массиве, соответствующий параметрам

В MongoDB мне хотелось бы найти документ, основанный на значениях поддокумента, удовлетворяющего определенным параметрам. В частности, у меня есть документ, структурированный следующим образом:

{
  name: "test",
  data: [{
    name: "test1",
    start: 0,
    end: 2
  },
  {
    name: "test2",
    start: 15
    end: 18
  }]
}

Как я могу сказать MongoDB только вернуть мой документ, если время начала для поддокумента данных меньше 5, а время окончания для того же вложенного документа больше 5? В настоящее время, если я делаю

db.foo.findOne({
  'data.start': { $lte: 5 },
  'data.end': { $gte: 5 }
})

он вернет мой документ всегда, потому что 5 больше 0 и меньше 18. Как я могу сказать MongoDB только вернуть мой документ, если 5 (или любое другое значение) больше 0 и меньше 2 ИЛИ больше 15 и менее 18?

4b9b3361

Ответ 1

Вы хотите использовать $elemMatch.

db.foo.findOne({ data: { $elemMatch : {
  start: { $lte: 5 },
  end: { $gte: 5 }
  }}
})

Ответ 2

Пришел к этому сообщению, думая об обмане кода, которого там не было;) Поэтому подумал об обмене фрагментом кода в Java с помощью spring-data-mongodb

Mongo mongo = new Mongo("localhost", 27017);
MongoTemplate mongoTemplate = new MongoTemplate(mongo, "db");
Query query = new Query();
query.addCriteria(Criteria.where("data").elemMatch(
         Criteria.where("start").lte(5)
        .andOperator(Criteria.where("end").gte(5))));
Foo foo = mongoTemplate.findOne(query, Foo.class);