CouchDB在运行时映射/减少任何文档属性?

时间:2011-06-28 01:47:35

标签: couchdb document-database

我来自SQL世界,其中查找由多个对象属性(已发布= TRUE或user_id = X)完成,并且无任何连接(因为1:1缓存层)。似乎文档数据库非常适合我的数据。

我试图弄清楚是否有办法将一个(或多个)对象属性传递给CouchDB map/reduce function,以便在数据库中查找匹配的文档而无需创建数十个视图对于每种文档类型。

是否可以传递所需的文档属性键以在运行时匹配CouchDB并让它返回匹配的对象(或匹配分页的对象的数量)?

例如,在一个页面上,我希望所有帖子的doc.user_iddoc.published。在另一个页面上,我可能希望doc.tags[]的所有文档都带有“sport”标签。

3 个答案:

答案 0 :(得分:6)

您可以构建一个迭代文档中的键的视图,并发出[propertyName, propertyValue]的键 - 这样您就可以构建一个具有EVERYTHING prop / value的索引。将是巨大的,不知道如何构建性能和磁盘使用(可能是坏的)。

地图功能看起来像:

// note - totally untested, my CouchDB fu is rusty
function(doc) {
  for(prop in doc) {
    emit([prop, doc[prop]], null);
  }
}

适用于简单属性的基本情况,可以扩展为智能数组,并为数组中的每个项发出一个prop / value对。这样可以让你处理标签。

要对其进行查询,请在视图上将[prop]设置为查询键。

答案 1 :(得分:2)

基本上没有。

Couch和SQL DB之间的关键区别在于,在CouchDB中查询的唯一方法主要是通过视图/索引。 SQL中的索引是可选的。它们(大多数)存在以提高性能。例如,如果您有一个小型数据库,您的应用程序将在具有0个索引的SQL上运行正常。 (可能存在一些独特约束的问题,但这是一个细节。)

总的来说,SQL数据库中查询处理器的一部分包括除简单索引之外的其他数据访问方法,特别是表扫描,合并连接等。

Couch没有查询处理器。它有用于定义B-Tree索引的视图(由JS定义)。

而且就是这样。那是Couch的锤子。这是一个很好的锤子。数据处理领域已持续了40年。

在Couch中创建索引(基于数据量)有些昂贵,这就是为什么“临时视图”不受欢迎的原因。而且它们也需要维护成本,因此视图需要成为数据库中有意识的设计元素。与此同时,它们也比普通的SQL索引更强大。

您可以随时在Couch上添加自己的查询处理,但这对您来说更有用。您可以根据最常用或选择性标准创建一些选择视图,然后在您自己的代码中按照其他条件过滤生成的文档。是的,您必须这样做,因此您必须质疑所涉及的工作是否比您在Couch解决方案中提供的任何好处(HTTP API,复制,安全,始终一致的数据存储等)更有价值。< / p>

答案 2 :(得分:0)

我遇到了类似这样的问题,并使用CouchDB-Python(这是一个很棒的库)构建了一个快速的解决方法。这不是一个漂亮的解决方案(违反CouchDB的原则),但它确实有效。

CouchDB-Python为您提供“查询”功能,允许您“对数据库执行临时临时视图”。你可以阅读它here

我所拥有的是将javascript函数存储为python中的字符串,并将其与我在Python中定义的变量名称连接起来。

在some_function.py中

variable = value

# Map function (in javascript)
map_fn = """function(doc) {
     <javascript code>
     var survey_match = """ + variable + """;
     <javascript code>
"""

# Iterates through rows
for row in db.query(map_fn):
     <python code>

肯定不是很漂亮,可能打破了一堆CouchDB哲学,但它确实有效。

d