RavenDBを初めて使用しています。私はマルチマップインデックス機能を使用しようとしていますが、それが私の問題に対する最良のアプローチかどうかはわかりません。だから私は3つのドキュメント:ユニット、車、人々があります。RavenDBマルチマップインデックス
車の文書は、次のようになります。
{
Id: "people/1235",
FirstName: "test",
LastName: "test"
}
とユニットDOC:
{
Id: "units/4321",
Address: "blah blah"
}
これが私の本当で、略し例である
{
Id: "cars/123",
PersonId: "people/1235",
UnitId: "units/4321",
Make: "Toyota",
Model: "Prius"
}
人々のドキュメントは、次のようになりますより多くのフィールドがあるので、データの正規化が私の最後の手段になります。
この3つのドキュメントのすべてを1つのドキュメントにまとめて作成するインデックスを作成して作成する必要があります。このような何か:
{
CarId: "cars/123",
PersonId: "people/1235",
UnitId: "units/4321",
Make: "Toyota",
Model: "Prius"
FirstName: "test",
LastName: "test"
Address: "blah blah"
}
// same unit different person owns a different car
{
CarId: "cars/122",
PersonId: "people/1236",
UnitId: "units/4321",
Make: "Toyota",
Model: "4runner"
FirstName: "test",
LastName: "test"
Address: "blah blah"
}
リレーショナルデータベースで、私はちょうど2つを使用するには、IDS によって人とユニットのテーブルに参加し、私の車のテーブルは、集約エンティティになります。ここで
は、私が持っているインデックス定義である:public class MyMultiIndex : AbstractMultiMapIndexCreationTask<JoinedDocument>
{
public MyMultiIndex()
{
// creating maps
AddMap<Car>(cars => cars.Select(e => new { e.CarId, e.Make, e.Model, PersonId = e.PersonId, UnitId = e.UnitId, FirstName = (null)string, LastName = (null)string, Address = (nul)string }));
AddMap<People>(people => people.Select(e => new { CarId = (string)null, Make = (string)null, Model = (string)null, PersonId = e.Id, UnitId = (null)string, FirstName = e.FirstName, LastName = e.LastName, Address = (nul)string }));
AddMap<Unit>(people => people.Select(e => new { CarId = (string)null, Make = (string)null, Model = (string)null, PersonId = (null)string, UnitId = e.null, FirstName = (nul)string , LastName = (nul)string , Address = e.Address }));
Reduce = results => from result in results
group result by result.CarId
into g
select new JoinedDocument
{
CarId = g.Key,
PersonId = g.First(e => e.CarId == g.Key).PersonId,
UnitId = g.First(e => e.CarId == g.Key).UnitId,
Model = g.First(e => e.CarId == g.Key).Model,
Make = g.First(e => e.CarId == g.Key).Make,
**// this never works. It is like result set does not contain anything with this personId. It looks like AddMap for people document did not work.**
FirstName = results.First(e => e.PersonId == g.First(ie => ie.CarId == g.Key).PersonId).FirstName,
**// this never works. It is like result set does not contain anything with this personId. It looks like AddMap for people document did not work.**
LastName = results.First(e => e.PersonId == g.First(ie => ie.CarId == g.Key).PersonId).LastName,
**// this never works. It is like result set does not contain anything with this personId. It looks like AddMap for unit document did not work.**
UnitAddress = results.First(e => e.UnitId == g.First(ie => ie.CarId == g.Key).UnitId).LastName,
};
Index(map => map.Model, FieldIndexing.Analyzed);
Index(map => map.Make, FieldIndexing.Analyzed);
Index(map => map.LastName, FieldIndexing.Analyzed);
Index(map => map.FirstName, FieldIndexing.Analyzed);
Index(map => map.Make, FieldIndexing.Analyzed);
Index(map => map.UnitAddress, FieldIndexing.Analyzed);
}
}
RavenDbが、私が提供した削減機能を実行しようとしたとき、私はエラーを表示このインデックスを実行します。私は人の姓と名字が存在するレコードに一致させようとしているときにエラーをスローします。同じことがユニットで起こります。
メーリングリストのクロス投稿:https://groups.google.com/forum/?fromgroups#!topic/ravendb/Uym2tkvMaH8 –
[This posts](http://ayende.com/blog/156225/relational) -searching-sucks-donrsquo-t-try-to-replicate-it)は、この問題を直接解決します。 –