Spring Boot& MongoDB,查询嵌套映射的关键字

时间:2018-01-15 17:45:34

标签: json mongodb spring-boot

我试图在MongoDB中查询文档内部具有特定键的所有文档的嵌套映射

{
   "_id" : ObjectId("5a5cd9711736c32c45f11adf"),
   "name" : "Test A",
   "userSubscription" : {
      "map" : {
          "1234" : true,
          "999" : true,
      }
   }
}

我查询如下:

db.getCollection('myColl').find( { "userSubscription.map" : {"1234":true }})

它工作,,它只返回包含单个值" 1234"的文档,所以如果" userSubscription.map"包含" 1234" " 5555"查询未显示任何结果。

我使用Robo3T来测试查询,使用SpringBoot注释来查询, 答案可以在Spring Boot注释查询中吗?

Spring Boot查询示例:

@Query("{QUERY : ?0}")
List<Person> findByUserSubscription(String key);

**&#34;?0&#34;是使用第一个方法param

感谢!!!

更新

现在文档看起来像这样:

{
"_id" : ObjectId("5a5cd9711736c32c45f11adf"),
   "name" : "Test A",    
   "userSubscription" : {
      "1234" : true,
      "3333" : true
    }
}

机器人3T查询:db.getCollection('Person').find({ "userSubscription.1234": {$exists : true} })

完美作品!

但是,Spring启动中的查询看起来像:

@Query("{userSubscription.?0 : {$exists: true} }")

并且它没有显示任何结果......

问题是什么???

2 个答案:

答案 0 :(得分:2)

将地图建模为array of embedded documents,如

{
  "map" : [
     {k: "1234", v: true},
     {k: "999", v: true}
  ]
}      

你可以按键找到

db.myColl.find({"userSubscription.map":{$elemMatch: { k: "1234", v: true } } })

@Query("{'userSubscription.map':{$elemMatch: { k: ?0, v: true } } }")
List<Person> findByUserSubscription(String key);

`

答案 1 :(得分:0)

在 Spring Data mongodb 中使用 Query 和 Criteria Class 有一个更简单的解决方案。如下图:

Query query = new Query();
query.addCriteria(Criteria.where("userSubscription."+key).exists(true));
return mongoTemplate.find(query, YourDocument.class);