2014-02-19 12 views
0

Я борюсь за создание простого индекса с ravendb.Индекс с двумя коллекциями

Учитывая две коллекции документов:

пользователей (34000 Docs) и BlogEntries (1,5 млн Docs)

1) Как я могу создать индекс, который показывает количество записей в блоге для каждого пользователя?

Отношения коллекции выглядит следующим образом:

User.LastName + «» + User.FirstName = Blog.CreatedBy

Немаловажным является тот факт, что BlogEntries содержит старые записи, которые не связаны с пользователем коллекция. Я хочу отфильтровать эти записи, чтобы они не отображались в индексе. Вот почему мне нужна коллекция пользователей здесь.

Образец данных:

User Collection: 
User U1 
User U2 

BlogEntry Collection: 
BlogEntry B1 -> U1 
BlogEntry B2 -> U1 
BlogEntry B3 -> U2 
BlogEntry B4 -> XYZ1 
BlogEntry B5 -> XYZ2 
BlogEntry B6 -> U1 

Я хочу, чтобы отфильтровать В4 и В5 записи, потому что они не связаны с пользователем в коллекции пользователя.

2) Должен ли я использовать для этого индекс мультимаров?

3) Я уже пробовал следующее через студию управления, но индекс не работает. Кажется, я не могу использовать две коллекции документов в одном блоке карты.

Карта:

from user in docs.Users 
from blog in docs.Blogs 
where blog.CreatedBy = user.LastName + "," + user.FirstName 
select new { UserName = user.LastName ..., Count = 1 } 

Сокращать

from result in results group by result.UserName 
into g 
select new { User = g.Key, g.Sum(x => x.Count) } 

Спасибо, Мариуса

ответ

1

С измененным требованием я думаю, что вам нужно мульти индекс карты:

AddMap<User>(users => from user in users 
         select new 
         { 
          UserName = user.LastName + "," + user.FirstName, 
          HasUser = true, 
          Count = 0 
         }); 

AddMap<BlogEntry>(blogEntries => from blogEntry in blogEntries 
           select new 
           { 
            UserName = blogEntry.CreatedBy, 
            HasUser = false, 
            Count = 1 
           }); 

Reduce = results => from result in results 
        group result by result.UserName 
        into g 
        select new 
        { 
         UserName = g.Key, 
         HasUser = g.Any(x => x.HasUser), 
         Count = g.Sum(x => x.Count) 
        }; 

Вы можете отфильтровать индекс по свойству HasUser.

+0

Привет, Thomas, я забыл упомянуть, что блоги содержат не только записи, относящиеся к пользователям. Не спрашивай меня, почему. Я думаю, что они старые записи, полученные из миграции данных много лет назад. Итак, в основном я хочу отфильтровать старые записи. Я изменю свой первоначальный пост. – Marius

+0

Я обновил свой ответ –

+0

Спасибо, Томас. После создания индекса, что содержит индекс? Все записи в блогах, сгруппированные по UserName? Проблема в том, что BlogEntry.CreatedBy не всегда содержит пользователя, который находится в коллекции пользователей. – Marius

Смежные вопросы