2016-01-07 56 views
0

我試圖創建一個靜態索引,我希望所有文檔都存在一個密鑰並具有一個值。價值本身並不重要,只有關鍵存在。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(例如,「用戶/ 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(); 

......我不想這樣做。我只希望結果具有值不爲空或空的鍵。有人有任何好的提示嗎?

回答

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

這將返回具有與user/1鍵和字典值,這不是空一Dictionary任何Result文件。

不知道它是做的最好的方式,但它的工作對我來說...

希望這有助於!