2012-03-30 7 views

答えて

2

RavenDBではこれを行うことはできません。クエリ対象のフィールドは述語の左側になければならず、述語の右側は別のフィールドを参照できません。

これを再構成する方法については - 申し訳ありませんが、わかりません。

編集:

さて、それはいくつかの実験をした - しかし、私はそれを再構築MaterializedPathのいずれかに可能ならそれを動作させる、または新しいプロパティを追加することができました。混乱を避けるために、ここでは新しい財産であると仮定します。

// Sample class: 
public class Item 
{ 
    public string Name { get;set;} 
    public Dictionary<int, string> Path { get;set;} // Zero-based key on path. 
} 


// Query: Find nodes with path "A B" 
var query = session.Query<Item>().AsQueryable(); 
query = query.Where(item => item.Path[0] == "A"); 
query = query.Where(item => item.Path[1] == "B"); 

var found = query.ToList(); 

そして、ここで実行されている:

IDocumentStore store = new EmbeddableDocumentStore { RunInMemory = true }; 
store.Initialize(); 

// Install Data 
using (var session = store.OpenSession()) 
{ 
    session.Store(new Item("Foo1", "A")); // NB: I have a constructor on Item which takes the path and splits it up. See below. 
    session.Store(new Item("Foo2", "A B")); 
    session.Store(new Item("Foo3", "A C D")); 
    session.Store(new Item("Foo4", "A B C D")); 
    session.Store(new Item("Foo5", "C B A")); 
    session.SaveChanges(); 
} 

using (var session = store.OpenSession()) 
{ 
    var query = session 
     .Query<Item>().AsQueryable(); 

    query = query.Where(item => item.Path[0] == "A"); 
    query = query.Where(item => item.Path[1] == "B"); 

    var found = query.ToList(); 

    Console.WriteLine("Found Items: {0}", found.Count); 

    foreach(var item in found) 
    { 
     Console.WriteLine("Item Name {0}, Path = {1}", item.Name, string.Join(" ", item.Path)); 
    } 
} 

をこの出力は次のようになります。

Found Items: 2 
Item Name Foo2, Path = [0, A] [1, B] 
Item Name Foo4, Path = [0, A] [1, B] [2, C] [3, D] 

お役に立てば幸いです。

編集2:私は、検索の可能性のそれぞれが含まれていますインデックスを構築提案ます

public Item(string name, string materializedPath) 
    { 
     Name = name; 
     var tmpPath = materializedPath.Split(' '); 
     Path = 
      tmpPath 
       .Zip(Enumerable.Range(0, tmpPath.Count()), (item, index) => new {Item = item, Index = index}) 
       .ToDictionary(k => k.Index, v => v.Item); 
    } 
+0

を表していることが重要です速い

Map = docs => from n in docs let allPaths = n.MaterializedPath.Split(new char[]{' '}) from path in allPaths select new { Path = path }; 

を検索するのLuceneの力で、あなたのインデックスが、同じ時間内の項目の多くを作成します。この述語でそれは効果的に同じことをすべきか、私は何かが恋しいのですか? –

+0

"A B C"は "A B"で始まり、 "A B"は "A B C"で始まらない。 –

+0

RavenDBはLucene(Luceneはフルテキスト検索エンジンである必要があります)をベースにしているので、これを行う方法があると確信しています... RavenDBの高度なLuceneクエリのようなものでしょうか? – W3Max

1

私はアイテムを持っているコンストラクタは、単にテストを容易にするために、次のようになります。なぜ側面を反転いない - これは、それは「パス」はまた、ユニークな文書ID

+0

非常に良い答えです。最初はうまくいくと思っていましたが、残念なことにタグは木々とは少し異なります。 – W3Max

関連する問題