RavenDB在字典

时间:2016-01-07 10:04:56

标签: indexing ravendb

我试图创建一个静态索引,我想要一个密钥存在且有值的所有文档。值本身并不重要,只存在密钥。

我正在使用动态字段探索此示例: https://ravendb.net/docs/article-page/2.5/csharp/client-api/advanced/dynamic-fields

...虽然我让索引工作,但我不确定我使用的查询是否正确。

这是示例类:

public class Result
{
    public Dictionary<string, List<Data>> Results { get; set; }
}

字典中的键是用户的ID(例如&#34; user / 1&#34;),值是数据对象列表。所以json结构看起来像这样:

{
  "Results" :
  {
    "user/1": [{...}],
    "user/2": [{...}],
  }
}

我使用的索引是:

public class Result_ByUserId : AbstractIndexCreationTask<Result>
{
    public Result_ByUserId()
    {
        Map = res => from r in res
                          select new
                          {
                              _ = r.Results
                                  .Select(d => CreateField(d.Key, d.Value))
                          };
    }
}

我的问题归结为查询,因为它假设我想查看特定的键和值。

var resultat = session.Advanced.DocumentQuery<Result>("Result/ByUserId ")
                .WhereEquals("user/1", "") // How do I write a !isNullOrEmpty?
                .ToList();

......我不想做。我只希望结果具有一个键,其中值不为null或为空。有人有什么好的建议吗?

1 个答案:

答案 0 :(得分:0)

你可以做的是根据字典是否有值来索引一个布尔标志,然后对其进行查询。

public class Result_ByUserId : AbstractIndexCreationTask<Result>
{
    public Result_ByUserId()
    {
        Map = res => from r in res
                        select new
                        {
                            _ = r.Results
                                .Select(d => CreateField(d.Key, d.Value != null ? true : false, false, true))
                        };
    }
}

然后查询可以是:

var resultat = session.Advanced.DocumentQuery<Result>("Result/ByUserId ")
    .WhereEquals("user/1", true) 
    .ToList();

这将返回任何Result文件,其中Dictionary的密钥为user/1,字典值不为空。

不确定这是最好的方式,但它对我有用......

希望这有帮助!