Как выбрать один элемент из встроенного массива с помощью официального драйвера C #. Лучшая практика? - PullRequest
1 голос
/ 25 ноября 2011

Учитывая, что этот документ представляет собой коллекцию курсов, я хотел бы выбрать один объект участника из встроенного массива

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

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

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

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

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

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

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

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

0 голосов
/ 25 ноября 2011

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

...