Проблема может быть решена с помощью Индексы с динамическими полями .Это позволяет сохранить логическую структуру данных и избежать создания индекса разветвления .
Решение
Создать следующий индекс для коллекции Document
извыше:
public class MyIndex : AbstractIndexCreationTask<Document, DocumentIndDto>
{
public MyIndex()
{
// Add fields that are used for filtering and sorting
Map = docs =>
from e in docs
select new
{
Title = e.Title,
_ = e.RecentModifications.Select( x => CreateField ($"{nameof(Document.RecentModifications)}_{x.UserId}", x.Timestamp))
};
}
}
public class DocumentIndDto
{
public string Title { get; set; }
public Dictionary<string,DateTime> RecentModifications { get; set; }
}
Запрос на MyIndex
как
var q = s.Query<DocumentIndDto, MyIndex>()
.Where(p => p.Title == "Super" && p. RecentModifications["User1"] < DateTime.Now);
Пояснение
Указанный индекс с динамическими полями будет генерировать дополнительные поляи термины для каждой записи в следующем формате:
RecentModifications_User1 = '2018-07-01';
RecentModifications_User2 = '2018-07-02';
Формат важен, потому что когда вы используете словарь в запросе высокого уровня, например myDic[key]
, он преобразуется в myDic_key
всгенерированный RQL.Следовательно, это позволит нам использовать эти поля в запросах.
Если вы запрашиваете с использованием обычного Query
вместо DocumentQuery
(см. docs ), то вам нужнотип данных для LINQ для работы.Для этого я создал класс DocumentIndDto
, где мой RecentModifications
стал словарем, поэтому я мог использовать его в высокоуровневом запросе и получить правильный RQL, такой как
from index 'MyIndex' where Title = $p0 and RecentModifications_User1 = $p1
Подробнее см.моя дискуссия на эту тему с Ореном Эйни (он же Айенде Райен).