我知道这个问题的变体之前已被问过(甚至是我),但我仍然不明白这个问题......
据我所知,通过执行以下操作,可以检索比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的介绍性博客文章可以在这里找到.
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)
每个会话的请求数是一个单独的概念,然后是每次调用检索的文档数.会议是短暂的,预计会发出很少的电话.
如果您从商店获得超过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)
归档时间: |
|
查看次数: |
10311 次 |
最近记录: |