Couchbase可能吗?

时间:2013-11-20 00:16:31

标签: couchdb elasticsearch couchbase

通过Couchbase视图或couchbase中可用的任何其他方法,可以检索与WHERE AND的SQL查询等效的结果集。例如,执行以下SQL查询。日期字段是时间戳:

SELECT * FROM items WHERE category = 'Trips' AND visible = 'EVERYONE' ORDER BY date

看来,对于视图,只有使用startkey和endkey的复杂键的第一个字段实际上可以限制为一个类别。例如,使用下面的视图,使用第一个值作为开始和结束键的Trips传递的复杂键将结果集限制为仅仅是Trips项。只有以下键的问题只是对数据进行排序。这是正确的还是我错过了什么?

function (doc, meta) 
{
  if(meta.type == "json" && doc.type == "POST") 
  {
    emit([doc.category, dateToArray(doc.created), doc.visibility], null);
  }
}

是否可以在Couchbase中执行上述SQL查询,返回结果集,其中唯一的结果符合这两个条件?

我知道弹性搜索插件。这会提供我追求的功能吗?但它是否会以生产环境中的另一个服务器集群为代价,并且由于索引而导致结果不可用?

1 个答案:

答案 0 :(得分:2)

如果您确实需要WHERE AND(就像在您的sql示例中那样)尝试:

function (doc, meta) 
{
  if(meta.type == "json" && doc.type == "POST") 
  {
    emit([doc.category, doc.visibility, dateToArray(doc.created)], null);
  }
}

startkey = ['Trips', 'EVERYONE']; endkey = ['Trips', 'EVERYONE', {}]

复杂键中的排序参数非常重要。您需要首先放置所有“常量”,因为这些文档的日期会有所不同,并且您在复杂键中的日期之后放置的所有内容都将被忽略。 仔细查看这个thread,你会找到有关couchbase索引如何工作的答案。

因此,如果您需要一个或多个字段的完全匹配,则可以使用couchbase执行此操作。如果您需要按多个范围过滤结果(例如doc.price = 100 ... 200和doc.category = 1..5),您需要1)多个视图和应用程序端合并(坏方法)或2)elasticsearch插件(更好的方式)