我的Raven数据库中包含Foo
类型的超过128个文档:
class Foo {
public string Id {get; set;}
public string Name {get; set;}
}
对于两个文档,Name
属性的值为"MyName"
。
使用IDocumentSession session
,如果我执行session.query<Foo>().Where(f => f.Name.equals("MyName"))
,则结果为零。这似乎是因为从RavenDB服务器返回的128个文档中没有返回匹配"MyName"
的两个文档(这是默认的客户端页面大小)。因此,客户端API在返回的128个文档上按Name=="MyName"
进行过滤,但由于我的两个匹配文档不在前128个文档中,因此找不到匹配的文档。我通过1.在我的浏览器中查看我的RavenDb工作室并验证这两个文档是否存在来验证这个假设,以及2.通过实现无限制的流式查询并成功检索这两个文档:
var results = new List<Foo>();
var query = session.Query<Foo>().Where(f => f.Name.equals("MyName");
using (var enumerator = session.Advanced.Stream(query){
while (enumerator.MoveNext()){
results.Add(enumerator.Current.Document);
}
}
然而,流媒体解决方案对我来说并不理想。我的问题如下:在将128个文档返回给客户端之前,有没有办法要求RavenDB对服务器上的Name执行过滤?我想在我的数据库中搜索我的给定Where
过滤器的所有文档,但是一旦应用了过滤器,我完全满足于让服务器将&lt; = 128文档返回到客户端API。
答案 0 :(得分:2)
您的假设不正确。默认页面大小适用于查询结果,而不适用于您要查询的文档集合(如果这是真的,它将导致左右问题,因为您无法控制首先出现的内容以及最后出现的内容集合)。
您是否实际执行了查询(即调用query.ToList()
或类似的东西)? - 如果您这样做,请提供显示查询的更多代码并分配结果。
修改强>
所以这在我的机器上按预期工作:
[TestFixture]
public class UnitTest3
{
public class Foo
{
public string Id { get; set; }
public string Name { get; set; }
}
private readonly IDocumentStore _documentStore;
public UnitTest3()
{
_documentStore = new EmbeddableDocumentStore
{
Configuration =
{
RunInUnreliableYetFastModeThatIsNotSuitableForProduction = true,
RunInMemory = true,
}
}.Initialize();
}
public void InsertDummies()
{
using (IDocumentSession session = _documentStore.OpenSession())
{
for (int i = 0; i < 1000; i++)
{
Foo foo = new Foo { Name = "Foo" + i };
session.Store(foo);
}
Foo fooA = new Foo { Name = "MyName"};
session.Store(fooA);
Foo fooB = new Foo { Name = "MyName" };
session.Store(fooB);
session.SaveChanges();
}
}
[Test]
public void Query()
{
List<Foo> result;
InsertDummies();
using (IDocumentSession session = _documentStore.OpenSession())
{
result = session.Query<Foo>().Where(f => f.Name.Equals("MyName")).ToList();
}
Assert.AreEqual(2, result.Count);
}
}
您是否检查索引是否过时? - https://ravendb.net/docs/article-page/3.0/csharp/indexes/stale-indexes