Json 弹簧靴;MongoDB,查询密钥的嵌套映射
我试图在MongoDB中查询文档嵌套映射中具有特定键的所有文档Json 弹簧靴;MongoDB,查询密钥的嵌套映射,json,mongodb,spring-boot,Json,Mongodb,Spring Boot,我试图在MongoDB中查询文档嵌套映射中具有特定键的所有文档 { "_id" : ObjectId("5a5cd9711736c32c45f11adf"), "name" : "Test A", "userSubscription" : { "map" : { "1234" : true, "999" : true, } } } 我的疑问如下: db.getCollection('myColl').fin
{
"_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引导注释查询中找到吗
Spring启动查询示例:
@Query("{QUERY : ?0}")
List<Person> findByUserSubscription(String key);
机器人3T查询:db.getCollection('Person').find({“userSubscription.1234”:{$exists:true}})
工作完美
但是,Spring boot中的查询如下所示:
@Query("{userSubscription.?0 : {$exists: true} }")
它没有显示任何结果
有什么问题吗?像这样对地图建模
你可以通过钥匙找到
db.myColl.find({"userSubscription.map":{$elemMatch: { k: "1234", v: true } } })
及
@Query(“{'userSubscription.map':{$elemMatch:{k:-0,v:true}}”)
列出findByUserSubscription(字符串键);
`在Spring Data mongodb中使用查询和条件类有一个更简单的解决方案。如下图所示:
Query query = new Query();
query.addCriteria(Criteria.where("userSubscription."+key).exists(true));
return mongoTemplate.find(query, YourDocument.class);
我无法理解如何从java代码中实现这种结构。在查询之前,必须运行update以移动到新的结构。你就是这么做的吗?这就是一个例子。如果您不能选择更新到新结构,则必须运行聚合。它不是活动数据库,因此我可以删除该集合。我不明白这个结构是如何在Java代码中表示的。userSubscription现在是一个带有key&value的映射对象数组?它不是一个活动数据库,因此我可以删除集合。我不明白这个结构是如何在Java代码中表示的。userSubscription现在是一个带有key&value的映射对象数组?整个想法不是迭代整个数组,因此我可以使用put和键的映射将是唯一的…我同意您的方法,但mongodb无法以您的方式查询结构。等效的mongodb结构是嵌入式文档数组。因此,要在java中对此进行建模,可以使用
List
。在服务器端执行直接密钥查找时,不需要迭代。如果您希望保留结构(本质上是将其转换为聚合管道中的mongo db结构),则必须使用聚合查询
db.myColl.find({"userSubscription.map":{$elemMatch: { k: "1234", v: true } } })
@Query("{'userSubscription.map':{$elemMatch: { k: ?0, v: true } } }")
List<Person> findByUserSubscription(String key);
Query query = new Query();
query.addCriteria(Criteria.where("userSubscription."+key).exists(true));
return mongoTemplate.find(query, YourDocument.class);