/ / RavenDb Повертає тільки індексовані поля - .net, nosql, ravendb

RavenDb Повертає тільки індексовані поля - .net, nosql, ravendb

Уявімо, що я маю наступний індекс:

public class PostsForList: AbstractIndexCreationTask<Post, PostsForList.ReduceResult>
{
public class ReduceResult
{
public string Id { get; set; }
public string Title { get; set; }
public long CommentsCount { get; set; }
}

public PostsForList()
{
Map = posts => from post in posts
select
new
{
Id = post.Id,
Title = post.Title,
CommentsCount = post.Comments,
};
}
}

Якщо я виконаю його, RavenDb поверне не тільки Id, Title і NumberCount, але й весь документ Post. Але мені не потрібен весь документ (уявімо, що він містить багато іншого).

Як я не розумію, зараз є два рішення:

  1. Позначити поля індексу як Збережені і викликати AsProjection для запиту. Я не люблю це рішення за рахунок продуктивності та додаткових витрат на дисковий простір. Це більше схоже на обхід, ніж на рішення.
  2. Перетворити індекс мапи на індекс MapReduce навведення деякої підробленої частини зменшення (дорівнює карті), яка насправді не знижує нічого. Це виглядає як краще рішення, але це це дратує реалізувати цю підроблену зменшити частину.

Так чому ж немає більш природного рішення для цього (або може я просто не знаю про це), чи це концептуальне рішення?

Відповіді:

2 для відповіді № 1

Ви можете скористатись Функція проекцій RavenDB для виконання перетворення.

Це просто змінює форму документа Json після того, як RavenDB витягнув його з магазину документів, тому поля не повинні бути позначені як Stored щоб вона працювала

  public PostsForList()
{
Map = posts => from post in posts
select
new
{
Id = post.Id,
Title = post.Title,
CommentsCount = post.Comments,
};
TransformResults =
(database, posts) => from post in posts
select new { post.Id, post.Title, post.CommentsCount };
}

Ви все ще потребуєте нас .As<new type> при запиті цього індексу, в іншому випадку RavenDB скаржиться. Щось на зразок цього:

session.Query<Post, PostTitleCommentsCount>()
.Where(x => x.Title == "blah")
.As<PostTitleCommentsCount>()
.ToList();

Це найчастіше використовується, щоб дозволити об'єднання, див це повідомлення в блозі для отримання додаткової інформації, але працює і в цьому сценарії.