查询包含两个键的沙发基础 ios 视图时使用通配符



如何查询包含两个键的沙发库视图;第一个是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[@"用户名"] == @"john"的文档,无论doc[@"created"]的值如何(即我假设@{}相当于通配符)。

但是,尽管存在许多用户名为 @"john" 的文档,但查询仍返回 0 个匹配项。我一定是做错了什么,所以任何见解都非常感谢!

您似乎

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

此外,作为您答案的一般说明,在索引中发出整个文档绝对没有好处。它导致存储大小加倍,同时视图框架的低效操作。

进一步的调查表明,在查询数据库时使用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] ];

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

最新更新