我试图在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} }")
并且它没有显示任何结果......
问题是什么???
答案 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);