couchdb匹配多个不一致的密钥

couchdb匹配多个不一致的密钥,couchdb,Couchdb,考虑到以下两份文件: { "_id": "a6b8d3d7e2d61c97f4285220c103abca", "_rev": "7-ad8c3eaaab2d4abfa01abe36a74da171", "File":"/store/document/scan_bgd123.jpg", "Commend": "Describes a person", "DateAdded": "2014-07-17T14:13:00Z", "Name": "Joe",

考虑到以下两份文件:

{
   "_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”和“Color”=“Blue”。我意识到我需要一个视图,但我不知道键是什么,从这两个文档中可以看出,键/值对不一致。唯一一致的项是“文件”键

我正在尝试创建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"
    }
}

因此,我需要通过标记中的键>值对或任意数量的键>值对来查找我想要的文档。这里的问题是,我想用键>值对标记对象。每个视图的这些标记可能非常不同,因此下一个文档将有一整套不同的键>值对。

Couchdb支持灵活的模式。文档无需保持一致,即可进行查询。您的场景的视图非常简单。下面是应该实现这一技巧的map函数

function(doc){
if(doc.Make&&doc.Color)
emit([doc.Make,doc.Color],null);
}
这将为您提供一个视图,您可以像这样进行查询

/view name/key=[“福特”,“蓝色”]&包括_docs=true

这会给你想要的结果

根据评论进行编辑

为此,您将需要两个独立的视图。couchdb中的每个视图都是为了满足特定的查询需求而设计的。这意味着您必须考虑数据的访问策略。最初,您需要做更多的工作,但麻烦的是,您会得到索引的数据,并且访问时间非常快

所以直接回答你的问题。创建两个视图。一个是我们已经做过的制作,另一个是名字

function(doc){
if(doc.Name&&doc.LastName)
emit([doc.Name,doc.Name],null);
}
现在,“名称”视图将只索引那些包含名称的文档。其中as Make视图将索引其中包含Make的文档

当您没有查询的需求将来出现时会发生什么情况?

你可以试试看

  • 这可能是最简单的解决方案。用于动态查询。在这种情况下,您的体系结构将类似于couchdb视图,用于您知道应用程序将需要的查询。Lucene索引用于您不知道可能需要的查询。例如,您在in-couchdb查询中索引了name和last name。但是一个需求出现了,您可能需要按年龄进行查询,然后简单地将年龄字段转储到lucene中,剩下的就交给它了

  • 另一种方法是使用这种技术,您可以利用创建视图是一次性的成本这一事实,在活动时间较少的情况下创建视图,并在构建视图后将其部署到生产服务中

  • 结合步骤1和2!lucene在使用ppp技术构建视图时处理临时请求


  • 蒂阿克沙。这就是问题所在。该视图检查是否存在“Make”和“Color”,但是,下一个文档可能有一组完全不同的键值对,我希望匹配这些键值对。例如,我提供的另一个文档有“Name”和“LastName”。这意味着,根据提供的视图,我不会将此文档与query.Ty匹配,以获得您的帮助。我是noSQL和couchDB的新手,来自MySQL的背景,我正在努力寻找我的方向。所以相信我,当我说,我学到了很多。我在原来的问题上补充了一些信息。希望这有助于澄清。