При использовании драйвера Mongo C # происходит ли сортировка запросов в Mongo или на уровне C #? - PullRequest
0 голосов
/ 17 октября 2019

Предположим, что вы хотите получить пакет документов с полем метки времени из базы данных Mongo, используя драйвер C #, и вы хотите, чтобы они сортировались по метке времени в порядке убывания (-1).

При созданииindex, вам нужно включить поле timestamp в порядке -1 для запросов, которые сортируют таким образом? Или это не нужно, потому что сортировка будет происходить только после того, как документы будут извлечены из Mongodb и преобразованы в объекты C #, и, таким образом, отсортированы «в памяти» .NET?

Предположим, мои документы имеют поля: user_id, action_id и timestamp

Я хочу иметь индекс, который поможет в поиске всех действий для пользователя и отсортирован в порядке убывания. Должен ли мой индекс включать только user_id и action_id, или он также должен использовать поле timestamp?

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

MongoDB способен сортировать данные перед отправкой обратно клиенту. Когда вы предоставляете предложение sort в запросе, фактически выполняется сортировка mongod, а не драйвер или среда выполнения .NET.

Для сортировки может произойти 2 вещив зависимости от доступных индексов:

  1. Сортировка по индексу
  2. Сортировка без индекса

Хорошее правило: если вы хотитесортировать по полю, индекс, созданный для этого запроса, должен заканчиваться этим полем.

Так что, если вы запрашиваете просто поле timestamp, тогдавам нужен только индекс timestamp: -1 или timestamp: 1. Индекс можно использовать для запросов с любым направлением сортировки.

Если вы запрашиваете несколько полей, то вы хотите, чтобы индекс заканчивался на timestamp. Таким образом, для приведенного вами примера вам может потребоваться индекс типа { user_id: 1, action_id: 1, timestamp: -1 }, который будет поддерживать этот точный запрос.

Если не существует индекса, который можно использовать для сортировки, это произойдет в памяти. Однако существует ограничение на сортировку в памяти, чтобы предотвратить ухудшение качества обслуживания. На момент написания этого это 32 МБ . Если для операции сортировки требуется нечто большее, вам нужно создать индекс.

1 голос
/ 18 октября 2019

В соответствии с документами драйвер Mongo содержит реализацию LINQ, предназначенную для структуры агрегации Mongo. Это означает, что запрос типа

var query = from p in collection.AsQueryable()
            orderby p.Name, p.Age descending
            select p;

//or

var query = collection.AsQueryable()
    .OrderBy(p => p.Name)
    .ThenByDescending(p => p.Age);

будет отображаться в следующий конвейер агрегации:

[
    { $sort: { Name: 1, Age: -1 } },
]

Конечно, вам не нужно использовать LINQ, вы также можете писать эквивалентные запросы без него,Но ответ таков: да, драйвер поддерживает преобразование ваших запросов во что-то, выполняемое на стороне БД.

Эта страница в документации относится, я полагаю, к конкретной ситуации, которую вы описываете:

db.records.createIndex( { a: 1 } )

будет поддерживать как обратный, так и обратный порядок следования:

db.records.find().sort( { a: 1 } )
db.records.find().sort( { a: -1 } )

В документах есть много информации об индексах, поэтому я рекомендую прочитать их, чтобы получитьощущение того, что лучше для вашего случая использования.

...