2011-11-25 1 views
1

Учитывая данный момент этот документ образует коллекцию курсов я хотел бы выбрать одного объекта участника из встроенного массиваКак выбрать один элемент из встроенного массива с официальным драйвером C#. Лучшая практика?

{ 
    _id: someCourseId, 
    CourseName: "someName", 
    Participants[ 
     {UserId: X Name: "person1"}, 
     {UserId:Y, Name:"person2"}, 
     {UserID:Z, Name:"person3"} 
    ] 
} 

Как написать запрос с официальным C# резким водителем, который только возвращает вложенный массив Элемент с идентификатором пользователя Y?

Сейчас я могу выбрать курсы, имеющие участника с идентификатором Y с помощью Query.EQ («Participants.UserId», Y), и я могу выбрать только получить поле Участники объекта курса с использованием SetFields («Участники»), но если этот массив огромен, я не хочу, чтобы извлекал весь массив, но только один элемент. Это возможно?

Если нет, то я бы счел целесообразным не использовать встроенные массивы в случаях, когда требуется получение определенных элементов. Вместо этого следует использовать отдельную коллекцию для хранения значений массива и «внешнего ключа к корневому документу» (например, вы бы сделали это в СУБД). То есть в моем примере я бы создал коллекцию участников, где каждый doc имеет идентификатор курса. Вы согласны?

ответ

1

Вы можете использовать slice так:

// it will skip 0 elements and load only one element from nested array 
var slice = Fields.Slice("Participants", 0, 1); 

Кроме того, я думаю, вы знаете, что MongoDB всегда возвращает корневой документ, но вы можете изменить содержание этих документов с указанием полей, которые вы хотите нагрузки и размер вложенного массива ,

0

С текущей версией MongoDB это невозможно сделать. Как вы говорите, вам придется разделить его на две коллекции со ссылкой. Я должен был сделать это раньше из-за других ограничений встроенных массивов, таких как неспособность сортировать их в запросе.