【问题标题】:RavenDB: static index casting and sorting issueRavenDB:静态索引转换和排序问题
【发布时间】:2013-04-10 08:46:57
【问题描述】:

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 }

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

字段 Rate 具有 decimal 类型。

问题:

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

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 }

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

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

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

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

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

编辑: 另一个例子:

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

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    您可以使用IDocumentSession.Query(string indexName, [bool isMapReduce])IDocumentSession.Query&lt;TResult, TIndexCreator&gt;() 重载来显式指定静态索引。因此,在您的具体情况下,IDocumentSession.Query&lt;MyCollection, MyIndex&gt;()IDocumentSession.Query("MyIndex")

    【讨论】:

    • 感谢您的回答。是的,我知道我可以直接指定索引名称,但我不想这样做:) 我没有直接使用 Session.Query(),如果 Raven 在不指定名称的情况下自动选择索引,对我来说会更容易。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    相关资源
    最近更新 更多