如何创建返回字符串列表的 RavenDB 索引?

Posted

技术标签:

【中文标题】如何创建返回字符串列表的 RavenDB 索引?【英文标题】:How to create a RavenDB index that returns a list of strings? 【发布时间】:2012-01-17 03:59:25 【问题描述】:

我在表单上有一组文档“WineDocument”:


  "Name": "Barbicato Morellino Di Scansano",
  "Country": "Italy",
  "Region": "Tuscany",

我需要进行查询以查找“国家/地区”字段的所有唯一值。我一直在尝试创建一个看起来像这样的索引:

class WineCountriesIndex: AbstractIndexCreationTask<WineDocument, string> 
        public BeverageCountriesIndex() 
            Map = wines => from wine in wines
                           where wine.Country != null
                           select new  Key = wine.Country ;
            Reduce = results => from result in results
                                group result by result into g
                                select new  Key = g.Key ;
        
    

索引创建成功,我尝试使用以下代码:

IList<string> countries = session.Query<string, WineCountriesIndex>().ToList();

但这会产生 JsonSerializationException:“无法将 JSON 对象反序列化为类型 'System.String'。”。我猜这是因为 Json 解析器无法将 Key = "Italy 解析为字符串。但我不知道如何让 map/reduce 只返回一个字符串。

【问题讨论】:

wine.Country 是一个枚举? 不,它是一个字符串。它的可能值在编译时是未知的。 【参考方案1】:

我不知道这是否是最好的解决方法,但这就是我解决它的方法。我创建了一个如下所示的索引:

class WineCountriesIndex: AbstractIndexCreationTask<WineDocument, WineCountriesIndex.Result> 
    public class Result 
        public string Country  get; set; 
    

    public WineCountriesIndex() 
        Map = wines => from wine in wines
                       where wine.Country != null
                       select new  Country = wine.Country ;
        Reduce = results => from result in results
                            group result by result.Country into g
                            select new  Country = g.Key ;
    

然后我使用这段代码进行实际查询:

using(IDocumentSession session = _store.OpenSession()) 
    return session.Query<WineCountriesIndex.Result, WineCountriesIndex>().Select(country => country.Country).ToList();

【讨论】:

【参考方案2】:

问题是您的索引不是输出字符串,而是输出具有 Key 属性的对象,该属性是字符串。如果你真的想要,你会做一个预测,但我认为大卫的答案更好。

【讨论】:

以上是关于如何创建返回字符串列表的 RavenDB 索引?的主要内容,如果未能解决你的问题,请参考以下文章

RavenDB - 何时使用AbstractIndexCreationTask索引,排序和存储方法?

写入 RavenDb 后立即读取它会返回不一致的数据

从嵌入式 RavenDB 中的索引检索结果时出现问题

RavenDb:在单元测试时强制索引等到不陈旧

RavenDB 全文搜索

Ravendb 工作室认证