如何查询包含两个键的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次匹配。我必须做错事,所以非常感谢任何见解!
答案 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中显示为'值'关键路径,所以'创建'是可以排序的。希望这会对其他人有所帮助。