RavedDB "externaljoin" - PullRequest
       11

RavedDB "externaljoin"

0 голосов
/ 22 ноября 2018

У меня есть 2 набора документов в моей ravenDB, местоположение и адрес, например:

public class Location()
{
    public string Id{get;set;}
    public string Name{get;set;}
    public List<Address> Addresses{get;set;}

}

public class Address()
{
    public string Id{get;set;}
    public string StreetName {get;set;}
    public string PostalCode {get;set;}
}

Таким образом, у местоположения может быть ноль или много адресов.И у меня может быть много адресов, которые не назначены для местоположения.

Если у меня есть такие данные:

//2 Location document
{
Id:"Location/1",
Name: "My Location 1"
Addresses: [{id:"Address/1"},
            {id:"Address/2"}
            ]
}

{
Id:"Location/2",
Name: "My Location 2"
Addresses: [
            {id:"Address/2"}
            ]
}


//3 Address document
{
Id: "Address/1",
StreetName: "Street1 10",
PostalCode: "1000"
}

{
Id: "Address/2",
StreetName: "Street1 11",
PostalCode: "1000"
}

{
Id: "Address/3",
StreetName: "Street1 12",
PostalCode: "2000"
}

Я изо всех сил пытаюсь найти лучший способ создать индекс этого, который даст мне набор результатов, подобный этому:

StreetAddress PostalCode    Location
Street1 10  1000    My Location 1
Street2 11  1000    My Location 2
Street2 11  1000    My Location 1
Street3 12  2000

Буду признателен за любую информацию по этому вопросу: -)

1 Ответ

0 голосов
/ 26 ноября 2018

Один из вариантов - смоделировать наоборот, то есть

public class Location()
{
    public string Id {get;set;}
    public string Name {get;set;}

}

public class Address()
{
    public string Id {get;set;}
    public string StreetName {get;set;}
    public string PostalCode {get;set;}
    // Locations is a list with the Location documents IDs
    public List<string> Locations {get;set;}

}

И тогда индекс может быть:

from address in docs.Addresses
select new {
     StreetAddress = address.StreetName,
     PostalCode = address.PostalCode
}

А затем используйте следующий Запрос :

from index 'AddressesIndex' as x
load x.Locations as locations[]
select {
      StreetName: x.StreetName,
      PostalCode: x.PostalCode,
      Locations: locations.map(x => x.Name)
}

==========================================================================

Второй вариант заключается в использовании тех же моделей , которые указаны в описании вопроса, и определите
мульти-карта-уменьшение индекс.

Индекс multi-map-Reduce будет:

Первая карта:

from locationDoc in docs.Locations
from addressId in locationDoc.Addresses
let address = LoadDocument(addressId, "Addresses")
select new {
       StreetName = address.StreetName,
       PostalCode = (string)null,
       LocationNames = new []{locationDoc.Name},
}

Вторая карта:

from address in docs.Addresses
select new{
       StreetName = address.StreetName,
       PostalCode = address.PostalCode,
       LocationNames = (string)null
}

Сокращение:

from result in results
group result by new { result.StreetName } into g
select new {
       StreetName = g.Key.StreetName,
       PostalCode = g.Select(x => x.PostalCode).FirstOrDefault(x => x != null),
       LocationNames = g.SelectMany(x => x.LocationNames)
}
...