使用RavenDB检索超过128个文档的正确方法

Bob*_*orn 27 ravendb

我知道这个问题的变体之前已被问过(甚至是我),但我仍然不明白这个问题......

据我所知,通过执行以下操作,可以检索比128默认设置更多的文档:

session.Advanced.MaxNumberOfRequestsPerSession = int.MaxValue;
Run Code Online (Sandbox Code Playgroud)

我已经知道WHERE子句应该是一个ExpressionTree而不是Func,所以它被视为Queryable而不是Enumerable.所以我认为这应该有效:

public static List<T> GetObjectList<T>(Expression<Func<T, bool>> whereClause)
{
    using (IDocumentSession session = GetRavenSession())
    {
        return session.Query<T>().Where(whereClause).ToList();                
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这只返回128个文档.为什么?

注意,这是调用上述方法的代码:

RavenDataAccessComponent.GetObjectList<Ccm>(x => x.TimeStamp > lastReadTime);
Run Code Online (Sandbox Code Playgroud)

如果我添加Take(n),那么我可以获得尽可能多的文档.例如,这会返回200个文档:

return session.Query<T>().Where(whereClause).Take(200).ToList();
Run Code Online (Sandbox Code Playgroud)

基于所有这些,似乎检索数千个文档的适当方法是设置MaxNumberOfRequestsPerSession并在查询中使用Take().是对的吗?如果没有,应该怎么做?

对于我的应用程序,我需要检索数千个文档(其中包含非常少的数据).我们将这些文档保存在内存中,并用作图表的数据源.

**编辑**

我尝试在Take()中使用int.MaxValue:

return session.Query<T>().Where(whereClause).Take(int.MaxValue).ToList();
Run Code Online (Sandbox Code Playgroud)

然后返回1024.唉.我如何获得超过1024?

**编辑2 - 显示数据的示例文档**

{
  "Header_ID": 3525880,
  "Sub_ID": "120403261139",
  "TimeStamp": "2012-04-05T15:14:13.9870000",
  "Equipment_ID": "PBG11A-CCM",
  "AverageAbsorber1": "284.451",
  "AverageAbsorber2": "108.442",
  "AverageAbsorber3": "886.523",
  "AverageAbsorber4": "176.773"
}
Run Code Online (Sandbox Code Playgroud)

Sea*_*ron 37

值得注意的是,自2.5版以来,RavenDB有一个"无界结果API"允许流式传输.文档中的示例显示了如何使用它:

var query = session.Query<User>("Users/ByActive").Where(x => x.Active);
using (var enumerator = session.Advanced.Stream(query))
{
    while (enumerator.MoveNext())
    {
        User activeUser = enumerator.Current.Document;
    }
}
Run Code Online (Sandbox Code Playgroud)

支持标准的RavenDB查询,Lucence查询以及异步支持.

文档可以在这里找到.Ayende的介绍性博客文章可以在这里找到.

  • 请注意,使用Streaming API查询时,索引必须已存在.如果通过普通会话API运行查询,并且不存在匹配的索引,则将创建动态索引.但是在流API中,不会创建动态索引,并且服务器会抱怨找不到索引. (3认同)

Mik*_*sen 24

Take(n)默认情况下,该功能最多只能提供1024个.但是,您可以在Raven.Server.exe.config以下位置更改此默认值:

<add key="Raven/MaxPageSize" value="5000"/>
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅:http://ravendb.net/docs/intro/safe-by-default


Ale*_*kov 16

Take(n)函数默认情况下最多只能提供1024个.但是,您可以将它与Skip(n)结合使用以获取所有内容

        var points = new List<T>();
        var nextGroupOfPoints = new List<T>();
        const int ElementTakeCount = 1024;
        int i = 0;
        int skipResults = 0;

        do
        {
            nextGroupOfPoints = session.Query<T>().Statistics(out stats).Where(whereClause).Skip(i * ElementTakeCount + skipResults).Take(ElementTakeCount).ToList();
            i++;
            skipResults += stats.SkippedResults;

            points = points.Concat(nextGroupOfPoints).ToList();
        }
        while (nextGroupOfPoints.Count == ElementTakeCount);

        return points;
Run Code Online (Sandbox Code Playgroud)

RavenDB分页

  • 注意服务器请求数量的限制.根据Raven的"默认安全"设置,它最多只能向服务器进行30次往返,因此如果循环需要执行更多次,则会失败,因为循环的每次迭代都是另一个服务器请求. (4认同)

Pet*_*tin 5

每个会话的请求数是一个单独的概念,然后是每次调用检索的文档数.会议是短暂的,预计会发出很少的电话.

如果您从商店获得超过10件商品(甚至低于默认值128)供人类消费,那么出现问题或者您的问题需要不同的思考,然后卡车装载来自数据存储的文件.

RavenDB索引非常复杂.关于索引好文章在这里和方面在这里.

如果您需要执行数据聚合,请创建map/reduce索引,从而生成聚合数据,例如:

指数:

    from post in docs.Posts
    select new { post.Author, Count = 1 }

    from result in results
    group result by result.Author into g
    select new
    {
       Author = g.Key,
       Count = g.Sum(x=>x.Count)
    }
Run Code Online (Sandbox Code Playgroud)

查询:

session.Query<AuthorPostStats>("Posts/ByUser/Count")(x=>x.Author)();
Run Code Online (Sandbox Code Playgroud)