用Where()查询Raven仅对前128个文档进行筛选?

我们使用Raven来验证登录信息,以便人们可以进入我们的网站。

我们发现的是,如果你这样做:

// Context is an IDocumentSession 
Context.Query<UserModels>()
           .SingleOrDefault(u => u.Email.ToLower() == email.ToLower()); 

该查询仅在Raven的文档的前128个文档中进行过滤。 我们的数据库中有几千个,所以除非你的电子邮件恰好在第一个128个返回的内容中,否则你运气不好。

Raven样本代码或我在网上遇到的任何示例代码都不会执行使用Skip()和Take()遍历该集合的任何循环。

  • 这是Raven的理想行为吗?
  • 即使使用高级Lucene查询,它也是一样吗? 即; 高级查询的行为有什么不同?
  • 解决方案是否适合? 看起来有点丑陋。 :P
  • 我的解决方案是遍历所有文档的集合,直到遇到非空结果,然后断开并返回。

    public T SingleWithIndex(string indexName, Func<T, bool> where)
    {
        var pageIndex = 1;
        const int pageSize = 1024;
        RavenQueryStatistics stats;
    
    var queryResults = Context.Query<T>(indexName)
        .Statistics(out stats)
        .Customize(x => x.WaitForNonStaleResults())
        .Take(pageSize)
        .Where(where).SingleOrDefault();
    
    if (queryResults == null && stats.TotalResults > pageSize)
    {
        for (var i = 0; i < (stats.TotalResults / (pageIndex * pageSize)); i++)
        {
            queryResults = Context.Query<T>(indexName)
                .Statistics(out stats)
                .Customize(x => x.WaitForNonStaleResults())
                .Skip(pageIndex * pageSize)
                .Take(pageSize)
                .Where(where).SingleOrDefault();
    
            if (queryResults != null) break;
    
            pageIndex++;
        }
    
    }
    
    return queryResults;
    

    }

    编辑:

    使用下面的修复不会传递查询参数到我的RavenDB实例。 不知道为什么。

    Context.Query<UserModels>()
        .Where(u => u.Email == email)
        .SingleOrDefault();
    

    最后,我使用高级Lucene语法而不是linq查询,并且事情按预期工作。


    RavenDB不理解SingleOrDefault ,因此它在没有过滤器的情况下执行查询。 然后您的条件在结果集上执行,但默认的Raven仅返回前128个文档。 相反,你必须打电话

    Context.Query<UserModels>()
           .Where(u => u.Email == email)
           .SingleOrDefault();
    

    所以过滤由RavenDB / Lucene完成。

    链接地址: http://www.djcxy.com/p/50909.html

    上一篇: Querying Raven with Where() only filters against the first 128 documents?

    下一篇: How can I change the way the google docs website displays a PDF in Android?