具有未知散列键的Hashmap内的Mongo查询

时间:2013-09-10 21:27:06

标签: java mongodb spring-data-mongodb

平台: 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()的键不是固定的,而是在运行时生成的。

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

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

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

有什么想法吗?

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

1 个答案:

答案 0 :(得分:3)

如果fields是一个数组而您的密钥是子文档的一部分:

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

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

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

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