【问题标题】:Is it possible to retrieve the specific value in an array of objects inside an object in mongodb是否可以在mongodb中的对象内检索对象数组中的特定值
【发布时间】:2014-01-08 04:25:33
【问题描述】:

是否可以在 mongodb 中的另一个对象中检索对象数组中的特定值??

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

我的 json 结构如下所示

{"_id":"0001","汽车":[{"_id":"C001", "名称":"本田"},{"_id":"C002","名称":"福特"}]}

是否可以检索特定车辆站(stationId="0001" 和 carNo="C002")的“名称”值,即“福特”

如何查询 mongodb 以获取 vehicleStation 的值“Ford”(stationId="0001" 和 carNo="C002")

【问题讨论】:

  • 我能够更新数据,但我不知道如何在不从 java 端迭代对象列表的情况下重新获取数据 'Query query = new Query(Criteria.where("stationId"). is("0001").andOperator(Criteria.where("cars.carNo").is("C002")));mongoTemplate.upsert(query, new Update().set("cars.$.name", "宝马"), Car.class);`
  • 不熟悉spring,但应该有一些方法,如findfindOne,可以设置返回字段以及where-clause。
  • 是的...它只会返回对象,但我想要内部对象中的特定值。

标签: mongodb mongodb-query spring-data-mongodb


【解决方案1】:

由于您在顶层执行 _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 的子对象,这只会匹配为 documented 的第一个。

【讨论】:

    【解决方案2】:

    您可以使用$elemMatch projection 运算符来做到这一点。例如从外壳

    > db.so.find({_id:"0001"},{cars:{$elemMatch:{"_id":"C002"}}})
    { "_id" : "0001", "cars" : [  {  "_id" : "C002",  "name" : "Ford" } ] }
    

    【讨论】:

    • 它正在返回文档对象。但我想要单独的值“Ford”或匹配查询的内部对象 ({"_id":"C002","name":"Ford"})
    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 2018-09-22
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    相关资源
    最近更新 更多