如何查询包含两个键的沙发库视图;第一个是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"是可以排序的。希望这将帮助其他人。