2013-03-12 2 views
3

Мы храним миллионы подписчиков в нашей настройке Mongo. Мне было поручено поставить переднюю часть записей, позволяя им искать. Мой поисковый запрос выглядит великолепно, но мне нужно иметь возможность сортировать их и делать их доступными для просмотра. Наш дизайн Mongo таков, что информация о канале вложена в массив. Я попытался отсортировать по «Channels.Address», потому что Email - это наш единственный канал, у которого есть адрес, но он не работает именно так. Он возвращает мои результаты в том же порядке, есть ли у меня восходящий или нисходящий.Есть ли способ отсортировать результаты Mongo по вложенным коллекциям?

Наша коллекция выглядит примерно так:

Subscriber:

{ 
    "_id" : "", 
    "FirstName" : "Tester", 
    "LastName" : "Tester", 
    "Channels" : [{ 
     "_t" : "EmailChannel", 
     "IsEnabled" : true, 
     "Type" : 1, 
     "Address" : "[email protected]" 
    }, { 
     "_t" : "SmsChannel", 
     "IsEnabled" : true, 
     "Type" : 2, 
     "Number" : "88888888" 
    }, { 
     "_t" : "FaxChannel", 
     "IsEnabled" : false, 
     "Type" : 4, 
     "Number" : null 
    }] 
} 

Моя текущая идея заключается в том, чтобы написать MapReduce, который возвращает то, что мне нужно, и искать на том, что вместо этого. Но это кажется пустой тратой пространства. Это сильно используемый стол, поэтому я не могу использовать eval. У кого-нибудь есть предложения?

ответ

1

Насколько я знаю, не существует способа сортировать вложенный массив mongodb.

Вы можете сделать это по своему собственному коду с помощью сортировки по C#, или вы можете попробовать Aggregation Framework http://docs.mongodb.org/manual/applications/aggregation/. Вам нужно будет «воссоздать» ваш проект, разматывать каналы, сортировать их и перегруппироваться. Я думаю, это будет трюк!

+0

Спасибо, Виниций! Я пойду о том, чтобы установить 2.2 на моем сервере и посмотреть, что произойдет. – bberliner

1

Добавить поле под названием sort. Сохраните любой ключ, который вы хотите отсортировать в этом поле. Индексируйте его и используйте его как порядок сортировки.

Иногда вам необходимо де-нормализовать свои данные при работе с базами данных документов. Часто вам нужно преобразовать ключ в нижний регистр и, возможно, лишить определенных символов, чтобы создать заказ (или поле поиска), который соответствует вашим точным требованиям, и, конечно же, все ваши «сохранить» и «обновить», код должен поддерживать это дополнительное поле.

Вы также можете попробовать отсортировать по Channels.0.Address, но это предполагает, что ваш массив остается в определенном порядке, который кажется довольно хрупким.

+0

Спасибо за совет, Ян. Это то, что я рассматривал, за исключением того, что мы извлекаем данные из разных мест. Но это вариант, если мы не сможем его решить. И да, я не могу предположить, что мой массив останется в определенном порядке (это определенно не будет). – bberliner

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