代码之家  ›  专栏  ›  技术社区  ›  Bingla

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

  •  0
  • Bingla  · 技术社区  · 9 年前

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

    我正在用动态字段探索这个示例: 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(例如“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或空。有人有什么好建议吗?

    1 回复  |  直到 9 年前
        1
  •  0
  •   Jens Pettersson    9 年前

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

    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 和一个非空的字典值。

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

    希望这有帮助!