通过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查询,返回结果集,其中唯一的结果符合这两个条件?
我知道弹性搜索插件。这会提供我追求的功能吗?但它是否会以生产环境中的另一个服务器集群为代价,并且由于索引而导致结果不可用?
答案 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插件(更好的方式)