RavenDb Выполнять вычисления во время запроса - PullRequest
0 голосов
/ 27 января 2012

Я много раз читал, что RavenDb не выполняет никаких вычислений во время запроса. Например, вот цитата из статьи Айенде «Боль внедрения провайдеров LINQ»

Одной из особенностей RavenDB является то, что он не выполняет абсолютно никаких вычисления во время запросов; все данные для запроса уже подготовлен. Это означает, что мы можем достичь очень хороших скоростей запросов.

Но в то же время есть функция Live Projection, которая позволяет производить некоторые вычисления во время запроса. Например, здесь я использую сортировку и подсчет суммы:

TransformResults = (database, post) => from post in posts
                                       order by post.DateTime
                                       select new
                                                {
                                                  Id = post.Id,
                                                  CommentsCount = post.Comments.Sum()
                                                }

То есть RavenDb позволяет делать вычисления на лету, не так ли?

Обновление. Я решил привести еще один пример, когда вам действительно нужно вычислять (сортировать) вещи во время запроса. Задача: выберите 10 последних постов для определенного блога (предположим, у нас много блогов в нашей системе блогов):

public class LastPostsCommentsIndex: AbstractIndexCreationTask<Post>
{
    public class IndexResult
    {
        public string BlogId {get; set;}
    }

    public class PostComment
    {
        public string PostId { get; set; }
        public DateTime DateTime { get; set; }
        public string Author { get; set; }
        public string Text { get; set; }
    }

    public LastPostsCommentsIndex()
    {
        Map = posts => from post in posts
                       select new { BlogId = post.BlogId };

        TransformResults = (database, posts) => from post in posts
                                                from comment in post.Comments
                                                orderby comment.DateTime descending
                                                select new { PostId = post.Id, DateTime = comment.DateTime, Author = comment.Author, Text = comment.Text };
    }
}

В этом случае мы не можем сортировать результаты индекса карты - мы должны сортировать результаты на лету.

1 Ответ

2 голосов
/ 27 января 2012

Да, вы правы. Но ведь это и есть гнида, не правда ли?

Когда кто-то говорит о «вычислениях» в этом контексте, это подразумевает вычисления (например, Sum, Avg, Count) для нескольких документов.

...