Получение N документов в MongoDB перед идентификатором документа из отсортированного результата

У меня есть коллекция в MongoDB, как показано ниже. - ›Ссылка на Mongo Playground  введите описание изображения здесь

Я отсортировал коллекцию по Обзору и ID.

$sort{{ overview: 1,_id:1 }}

что приводит к такой коллекции.

введите описание изображения здесь

Когда я фильтрую коллекцию, чтобы показать только документы после темы 13., она работает должным образом.

$match{{
  _id:{$gt:ObjectId('605db89d208db95eb4878556')}
}}

введите описание изображения здесь

однако, когда я пытаюсь открыть документы, предшествующие теме 13, то есть субъекту 6, со следующим запросом, это не сработает так, как я ожидал.

$match{{
      _id:{$lt:ObjectId('605db89d208db95eb4878556')}
    }}

Вместо того, чтобы получить в результате только тему 6, я получаю следующее.

введите описание изображения здесь

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

Пожалуйста, предложите мне способ получить документы до определенного _id в mongodb.

У меня в коллекции 600 документов, это примерный набор данных. Мой полный совокупный запрос ниже.

[
  {
    '$sort': {
      'overview': 1, 
      '_id': 1
    }
  }, {
    '$match': {
      '_id': {
        '$lt': new ObjectId('605db89d208db95eb4878556')
      }
    }
  }
]

person Arun Shankar    schedule 27.03.2021    source источник
comment
Сколько всего документов у вас есть?   -  person Tushar Gupta - curioustushar    schedule 27.03.2021
comment
Можете ли вы добавить свой полный запрос?   -  person Tushar Gupta - curioustushar    schedule 27.03.2021
comment
Я добавил полный запрос в свой вопрос.   -  person Arun Shankar    schedule 27.03.2021
comment
Вместо того, чтобы получить в результате только тему 6, я получаю следующее. Я не понял этого, не могли бы вы пояснить.   -  person Tushar Gupta - curioustushar    schedule 27.03.2021
comment
добавьте сюда образец данных и запросите здесь mongoplayground.net - обновите историю со ссылкой.   -  person Tushar Gupta - curioustushar    schedule 27.03.2021
comment
Найдите ссылку здесь - ›Ссылка на Mongo Playground   -  person Arun Shankar    schedule 27.03.2021


Ответы (1)


MongoDB оптимизирует производительность запросов, перемещая сортировку в конец в вашем случае, так как вы $sort, а затем $match

https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/#sort-match-sequence-optimization

Когда у вас есть последовательность с $ sort, за которой следует $ match, $ match перемещается перед $ sort, чтобы минимизировать количество объектов для сортировки. Например, если конвейер состоит из следующих этапов:

[
  { '$sort': { 'overview': 1, '_id': 1 }  },
  { '$match': { '_id': { '$lt': new ObjectId('605db89d208db95eb4878556') } }
]

На этапе оптимизации оптимизатор преобразует последовательность в следующую:

[
    { '$match': { '_id': { '$lt': new ObjectId('605db89d208db95eb4878556') } },
    { '$sort': { 'overview': 1, '_id': 1 } }
]

Результат планировщика запросов -

Мы видим, что 1-й этап - это запрос соответствия, после которого выполняется сортировка.

{
    "stages" : [ 
        {
            "$cursor" : {
                "query" : {
                    "_id" : {
                        "$lt" : ObjectId("605db89d208db95eb4878556")
                    }
                },
                "queryPlanner" : {
                    "plannerVersion" : 1,
                    "namespace" : "video.data3",
                    "indexFilterSet" : false,
                    "parsedQuery" : {
                        "_id" : {
                            "$lt" : ObjectId("605db89d208db95eb4878556")
                        }
                    },
                    "winningPlan" : {
                        "stage" : "FETCH",
                        "inputStage" : {
                            "stage" : "IXSCAN",
                            "keyPattern" : {
                                "_id" : 1
                            },
                            "indexName" : "_id_",
                            "isMultiKey" : false,
                            "multiKeyPaths" : {
                                "_id" : []
                            },
                            "isUnique" : true,
                            "isSparse" : false,
                            "isPartial" : false,
                            "indexVersion" : 2,
                            "direction" : "forward",
                            "indexBounds" : {
                                "_id" : [ 
                                    "[ObjectId('000000000000000000000000'), ObjectId('605db89d208db95eb4878556'))"
                                ]
                            }
                        }
                    },
                    "rejectedPlans" : []
                }
            }
        }, 
        {
            "$sort" : {
                "sortKey" : {
                    "overview" : 1,
                    "_id" : 1
                }
            }
        }
    ],
    "ok" : 1.0
}
person Tushar Gupta - curioustushar    schedule 27.03.2021