考虑以下两个文件:
{
"_id": "a6b8d3d7e2d61c97f4285220c103abca",
"_rev": "7-ad8c3eaaab2d4abfa01abe36a74da171",
"File":"/store/document/scan_bgd123.jpg",
"Commend": "Describes a person",
"DateAdded": "2014-07-17T14:13:00Z",
"Name": "Joe",
"LastName": "Soap",
"Height": "192cm",
"Age": "25"
}
{
"_id": "a6b8d3d7e2d61c97f4285220c103c4a9",
"_rev": "1-f43410cb2fe51bfa13dfcedd560f9511",
"File":"/store/document/scan_adf123.jpg",
"Comment": "Describes a car",
"Make": "Ford",
"Year": "2011",
"Model": "Focus",
"Color": "Blue"
}
我如何找到基于多个标准的文档,例如" Make" =" Ford"和"颜色" ="蓝"。我知道我需要一个观点,但我不知道密钥是什么,正如你从两个文档中看到的那样,键/值对并不一致。唯一一致的项目将是"文件"键。
我试图创建couchDB数据库,该数据库将存储文件的位置,但标记为键/值对。
修改
也许我应该重新考虑我的数据结构。稍微修改一下?
{
"_id": "a6b8d3d7e2d61c97f4285220c103c4a9",
"_rev": "1-f43410cb2fe51bfa13dfcedd560f9511",
"File": "/store/document/scan_adf123.jpg",
"Tags": {
"Comment": "Describes a car",
"Make": "Ford",
"Year": "2011",
"Model": "Focus",
"Color": "Blue"
}
}
因此,我需要通过标记中的Key> Value对或任意数量的Key> Value对来查找我想要的文档。这里的问题是,我想用键>值对标记对象。每个视图的这些标签可能非常不同,因此下一个文档将具有Key> Value对的整个差异集。
答案 0 :(得分:1)
Couchdb支持灵活的架构。文档不需要一致,因为它们是可查询的。您的方案的视图非常简单。这是应该做的技巧的map函数。
function(doc){
if(doc.Make&&doc.Color)
emit([doc.Make,doc.Color],null);
}
这为您提供了一个视图,然后您可以查询
/view-name/key=["Ford","Blue"]&include_docs=true
这应该会给你想要的结果。
根据评论进行修改
为此您需要两个单独的视图。 couchdb中的每个视图都旨在满足特定的查询需求。这意味着您必须考虑数据的访问策略。最初你需要做的工作要多得多,但是为了给你带来麻烦,你可以获得索引并且访问时间非常快的数据。
所以直接回答你的问题。创建两个视图。一个像我们已经做过的Make,另一个用于像
这样的名字function(doc){
if(doc.Name&&doc.LastName)
emit([doc.Name,doc.Name],null);
}
现在,Name视图将仅索引其中包含名称的文档。 Make视图将索引那些包含make的文档。
如果将来有一个您没有查询的要求,会发生什么?
你可以尝试一些事情。
这可能是最简单的解决方案。使用couchdb-lucene进行动态查询。在这种情况下,您的体系结构将类似于您知道应用程序需要的查询的couchdb视图。您不了解的查询的Lucene索引可能需要。因此,例如,您在couchdb查询中索引了名称和姓氏。但是出现了一个要求,您可能需要按年龄进行查询,然后简单地将年龄字段转储到lucene中,它将负责其余部分。
另一种方法是使用PPP技术,您可以利用以下事实:创建视图是一次性成本,您可以在较少活动时创建视图,并在构建后将它们部署在生产服务中。
合并第1步和第2步! lucene在使用ppp技术构建视图时处理adhoc请求。