RavenDB 在字典上创建静态索引和查询

RavenDB creating static index and query on dictionary

我正在尝试创建一个静态索引,我希望所有文档都包含一个键并具有一个值。值本身并不重要,只有键存在。

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

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

这是示例 class:

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

字典中的键是用户的ID(例如"user/1"),值是数据对象列表。所以 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 或为空。有人有什么好的建议吗?

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

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();

这将 return 任何具有 Dictionaryuser/1 和不为空的字典值的 Result 文档。

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

希望对您有所帮助!