0

我对 RavenDB 索引有疑问。

简单查询如下所示:

        var values =
            myCollection.Query.Where(w =>
                w.MyId == MyId &&
                w.IsReady == false &&
                w.IsDeleted &&
                w.Rate > 0)

在执行期间,Raven 创建动态索引:

from doc in docs.MyCollection
select new { Rate = doc.Rate, IsReady = doc.IsReady, IsDeleted = doc.IsDeleted, MyId = doc.MyId }

带有额外选项:字段 -> 速率;存储 -> 否;索引-> 默认;排序->双;

字段速率具有十进制类型。

问题:

我想添加静态索引,但是当我像这样指定索引时:

public class MyIndex : AbstractIndexCreationTask<MyCollection> {
    public MyIndex () {
        Map = d => d.Select(s => new { Rate = s.Rate, IsReady = s.IsReady, IsDeleted = s.IsDeleted, MyId = s.MyId });
        Sort(x => x.Rate, SortOptions.Double);
    }
}

Raven 创建的索引略有不同:

from doc in docs.MyCollection
select new { Rate = (decimal)doc.Rate, IsReady = doc.IsReady, IsDeleted =    doc.IsDeleted, MyId = doc.MyId }

带有额外选项:字段 -> 速率;存储 -> 否;索引-> 默认;排序->双;

唯一的区别是我在静态索引中进行了强制转换,因为我的字段类型是十进制并且我使用的是排序选项。

因此,Raven 没有使用我的静态索引,而是在每次执行查询时创建动态索引。

我尝试在 Sort() 中进行一些转换,但是根本没有创建索引。解决此问题的一种方法是在创建后从管理控制台手动修改静态索引,但这不是一个好的解决方案。

任何想法如何处理?谢谢。

编辑:另一个例子:

字段DateTime的类型并使用DateTime值作为谓词进行查询(大于/小于)。Raven 在动态索引创建中选择String作为 SortOption,当我尝试准备静态索引时,我遇到了强制转换问题。

4

1 回答 1

0

您可以使用IDocumentSession.Query(string indexName, [bool isMapReduce])IDocumentSession.Query<TResult, TIndexCreator>()重载来显式指定静态索引。所以在你的具体情况下,要么IDocumentSession.Query<MyCollection, MyIndex>()要么IDocumentSession.Query("MyIndex")

于 2013-04-10T09:03:32.283 回答