使用未知哈希键在 Hashmap 中进行 Mongo 查询

问题描述 投票:0回答:2

平台:MongoDB、Spring、SpringDataMongoDB

我有一个名为“Encounter”的集合,其结构如下

遭遇:

{ "_id" : "49a0515b-e020-4e0d-aa6c-6f96bb867288", 
    "_class" : "com.keype.hawk.health.emr.api.transaction.model.Encounter",  
    "encounterTypeId" : "c4f657f0-015d-4b02-a216-f3beba2c64be", 
    "visitId" : "8b4c48c6-d969-4926-8b8f-05d2f58491ae", 
    "status" : "ACTIVE", 
    "form" : 
    { 
        "_id" : "be3cddc5-4cec-4ce5-8592-72f1d7a0f093", 
        "formCode" : "CBC", 
        "fields" : { 
            "dc" : { 
                "label" : "DC", 
                "name" : "tc", 
            }, 
            "tc" : { 
                "label" : "TC", 
                "name" : "tc", 


            }, 
            "notes" : { 
                "label" : "Notes", 
                "name" : "notes", 
            } 
        }, 
        "notes" : "Blood Test", 
        "dateCreated" : NumberLong("1376916746564"), 
        "dateModified" : NumberLong("1376916746564"), 
        "staffCreated" : 10013, 
        "staffModified" : 10013

    }, 
}

元素“

fields
”使用 Java Hashmap 表示为:

protected LinkedHashMap<String, Field> fields;

hashmap()的Key不是固定的,而是在运行时生成的。

如何查询获取集合中“label”=“TC”的所有文档?

不可能像

db.encounter.find({'form.fields.dc.label':'TC'})
那样查询,因为元素名称“dc”未知。我想跳过该位置和执行查询,例如:

db.encounter.find({'form.fields.*.label':'TC'});

有什么想法吗?

另外,在这种情况下如何最好地使用索引?

java mongodb spring-data-mongodb
2个回答
4
投票

如果

fields
是一个数组,并且您的键是子文档的一部分:

"fields" : [
   { "key"   : "dc",
     "label" : "DC",
     "name"  : "dc"
   },
   { "key"   : "tc",
     "label" : "TC",
     "name"  : "tc"
   }
]

在这种情况下,您可以简单地查询数组内的任何子元素:

db.coll.find({"form.fields.label":"TC"})

不确定如何将其与 Spring 集成,但也许这个想法有帮助?就索引而言,您可以对数组进行索引,这为您提供了多键索引。基本上,索引将有一个单独的条目指向每个数组值的文档。


0
投票

面临类似的问题并发现了这个:https://stackoverflow.com/a/75338607/1527469,即将对象转换为数组,进行过滤,然后转换回来:

db.encounter.aggregate([
    {
        "$set": {
            "form.fields": {
                "$objectToArray": "$form.fields"
            }
        }
    }, {

        "$match":
            {
                "form.fields.v.label": "TC"
            }
    },
    {
        "$set": {
            "form.fields": {
                "$arrayToObject": "$form.fields"
            }
        }
    }
])
© www.soinside.com 2019 - 2024. All rights reserved.