查询包含两个键的couchbase ios视图时使用通配符

时间:2015-01-19 20:11:03

标签: ios couchbase couchbase-lite

如何查询包含两个键的couchbase视图;第一个是NSNumber类型(在下面的例子中创建)和一个NSString类型(称为用户名)。

CBLView* view = [database viewNamed:@"by_username"];
if (!view.mapBlock)
{
    [view setMapBlock: MAPBLOCK({
        if ( [doc[@"type"] isEqualToString:@"user"] )
        {
            emit(@[doc[@"created"],doc[@"username"]], nil);
        };
    }) version: @"2"];
}

CBLQuery* q = [view createQuery];
q.keys = @[ @[ @{}, @"john" ] ];
// run query

通过上面的查询,我希望所有文档都与doc [@“username”] == @“john”相匹配,无论doc [@“created”]的值如何(即我是假设@ {}等同于通配符)。

但是,尽管存在许多带有用户名@“john”的文档,但查询返回0次匹配。我必须做错事,所以非常感谢任何见解!

2 个答案:

答案 0 :(得分:1)

您似乎正在尝试向后搜索,您的索引应按您要搜索的第一个项目进行组织。因此,如果您不关心created,则应将其从索引中删除,因为这会导致您遇到此问题。了解您可能需要将其用于其他查询,请使用此更改创建新视图。

另外,作为对答案的一般说明,在索引中发出整个doc绝对没有用。它导致存储大小加倍以及视图框架的低效操作。

答案 1 :(得分:0)

进一步调查显示在查询数据库时使用NSSortDescriptior的可能性,这将我的代码简化为以下内容:

CBLView* view = [database viewNamed:@"by_username"];
if (!view.mapBlock)
{
    [view setMapBlock: MAPBLOCK({
        if ( [doc[@"type"] isEqualToString:@"user"] )
        {
            emit(doc[@"username"], doc[@"created"]);
        };
    }) version: @"2"];
}

CBLQuery* q = [view createQuery];
q.keys = @[ @"john" ];

q.sortDescriptors = @[ [[NSSortDescriptor alloc] initWithKey:@"value" ascending:NO] ];

其中sortDescriptors是一个在这种情况下只有一个NSSortDescriptor的数组。请注意,mapBlock现在会发出' doc'对象,因此它在NSSortDescriptor中显示为'值'关键路径,所以'创建'是可以排序的。希望这会对其他人有所帮助。