Можно ли получить конкретное значение в массиве объектов внутри объекта в mongodb

Можно ли получить конкретное значение в массиве объектов внутри другого объекта в mongodb??

@Document
class vehicleStation {
   @Id
   String stationId;
   List<car> cars;
}
@Document
class car{
   @Id
   String carNo;
   String name;
}

И моя структура json будет выглядеть так, как показано ниже.

{"_id":"0001","cars":[{"_id":"C001", "name":"Honda"},{"_id":"C002","name":"Ford"}] }

Возможно ли получить значение «имя» для конкретной VehicleStation (stationId = «0001» и carNo = «C002»), которая является «Ford»

как запросить mongodb, чтобы получить значение «Ford» для VehicleStation (stationId = «0001» и carNo = «C002»)


person iswok    schedule 19.12.2013    source источник
comment
Я могу обновить данные, и я не знаю, как восстановить данные без повторения списка объектов со стороны Java 'Query query = new Query (Criteria.where (stationId).is (0001)). (cars.carNo).is(C002)));mongoTemplate.upsert(запрос, новое обновление().set(cars.$.name, BMW), Car.class);`   -  person iswok    schedule 19.12.2013
comment
Не знаком с Spring, но должны быть некоторые методы, такие как find или findOne, с возможностью установки полей возврата вместе с where-предложением.   -  person u_mulder    schedule 19.12.2013
comment
да... Он вернет только объект, но мне нужно определенное значение во внутреннем объекте.   -  person iswok    schedule 20.12.2013


Ответы (2)


Это можно сделать с помощью оператора $elemMatch. например из оболочки

> db.so.find({_id:"0001"},{cars:{$elemMatch:{"_id":"C002"}}})
{ "_id" : "0001", "cars" : [  {  "_id" : "C002",  "name" : "Ford" } ] }
person Sridhar Nanjundeswaran    schedule 19.12.2013
comment
Он возвращает объект документа. Но мне нужно либо значение Ford отдельно, либо внутренний объект, соответствующий запросу ({_id:C002,name:Ford}) - person iswok; 20.12.2013

Поскольку вы выполняете запрос _id на верхнем уровне, он возвращает только один документ. Ты можешь сделать

db.so.findOne({_id:"0001"},{cars:{$elemMatch:{"_id":"C002"}}}).cars[0]

чтобы получить внутренний объект или

db.so.findOne({_id:"0001"},{cars:{$elemMatch:{"_id":"C002"}}}).cars[0].name

чтобы получить только имя. Примечание. Если у вас есть несколько подобъектов с _id как C002, это будет только первое совпадение как задокументировано.

person Sridhar Nanjundeswaran    schedule 20.12.2013