使用Where()查询Raven只过滤前128个文档?

时间:2011-02-24 01:52:38

标签: lucene ravendb

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

我们发现如果您这样做:

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

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

没有任何Raven示例代码或任何代码 我在网上遇到的示例代码执行任何循环使用 Skip()和Take()遍历集合。

  1. 这是Raven想要的行为吗?
  2. 即使您使用高级Lucene查询,它是否也是相同的行为?即;高级查询的行为有何不同?
  3. 下面的解决方案是否合适?看起来有点难看。 :P
  4. 我的解决方案是遍历所有文档的集合,直到我 遇到非null结果,然后我打破并返回。

    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查询,事情正在按预期工作。

1 个答案:

答案 0 :(得分:4)

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

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

所以过滤由RavenDB / Lucene完成。