Json 弹簧靴;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

我试图在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引导注释查询中找到吗

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);