如何查询多个关键标准?

时间:2014-10-08 20:15:11

标签: couchdb

使用couchdb,使用以下json:

{"total_rows":3,"offset":0,"rows":[ {"id":"bc26e5eae7f8c8c3486818e7e7971df0","key":{"user":"lili@abc.com","pal":["igol ≠ eagle"],"fecha":"10/5/2014"},"value":null},{"id":"cf0dc2e2874776958c59f2f544b5a750","key":{"user":"lili@abc.com","pal":["kat ≠cat"],"fecha":"10/6/2014"},"value":null},{"id":"df4ec96088ed52096db064f2ebd2310b","key":{"user":"dum@ghi.com","pal":["dok ≠ duck"],"fecha":"10/7/2014"},"value":null}]}

我想查询特定用户和特定日期:

例如:     ?用户=" lili@def.com"&安培;出生日期:&#34 10 /2014分之6"

我也尝试过:     ?用户%3Dlili%40def.com%26fecha%3A10%2F6%2F2014

毋庸置疑,它目前还没有按照我的预期运行(所有结果都显示出来,而不仅仅是所需的寄存器)。

我的观点功能是:

function(doc) {

    if (doc.USER){

        emit({user:doc.USER, pal:doc.palabras, fecha:doc.fecha});  

    }
}

问候。

2 个答案:

答案 0 :(得分:2)

请记住,CouchDB视图只是在索引时而非查询时构建的键/值查找。在你发出没有价值的钥匙的那一刻。如果你想用两个值来查找,你需要发出一个复合键(一个数组):

function(doc) {
    if (doc.USER) {
        emit([doc.USER, doc.fecha], doc);
    }
}

然后,您可以通过将数组作为键来查找匹配的文档:

?key=%5B%22lili%40def.com%22%2C%20%2210%2F6%2F2014%22%5D

您可以对此进行优化(例如,发出null值并使用include_docs来缩小视图的大小)但这应该会让您走上正确的轨道。

答案 1 :(得分:0)

我和Ant P做同样的事情,但我倾向于使用字符串。

function ( doc ) {
  if ( doc.USER ) {
    emit( 'user-' + doc.USER + '-' + doc.fecha, doc );
  }
}

我还强烈建议发布null而不是doc作为值。

请记住,根据您需要的查询类型,您可以随时发出多次。

例如,如果您要在两个日期之间查找特定用户的所有帖子,则可以执行以下视图。

function ( doc ) {
  if ( doc.type == "post" ) {
    emit( 'user-' + doc.nombre, null );
    emit( 'fecha-' + doc.fecha, null );
  }
}

然后,您将查看视图两次_view/posts?key="user-miUsario"_view/posts?start_key="fecha-1413040000000"&end_key="fecha-1413049452904"。然后,一旦您从两个视图中获得了所有id,就可以使用_all_docs来获取原始文档。

您最终会发出三个请求,但它会在视图中节省磁盘空间,因为您返回null,所以有效负载较小,而且您的代码更简单,因为您可以通过多种方式查询同一视图。