我试图创建一个静态索引,我想要一个密钥存在且有值的所有文档。值本身并不重要,只存在密钥。
我正在使用动态字段探索此示例: 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或为空。有人有什么好的建议吗?
答案 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
,字典值不为空。
不确定这是最好的方式,但它对我有用......
希望这有帮助!