Intereting Posts
Drupal: как отображать результаты формы на одной и той же странице как форма xampp не смог запустить модуль mongo Вызовите 1 вид в Codeigniter, но поделитесь заголовком / нижним колонтитулом между всеми представлениями? php Mail () и Outlook API Google Translate v2 – пропустить слова и специальный символ YII2: Добавить поля динамической формы и их проверки Как получить внешний купон / ваучер на странице для работы в OpenCart? Я только что написал над своим WAMP index.php! Кто-нибудь знает, как я могу получить другую копию без повторной установки WAMP 24-часовое приложение для Android-приложений с веб-сервером PHP Получение M3U8 через PHP через веб-сайт дает разные переменные сеанса В чем проблема в коде, написанном для сравнения даты с сегодняшней датой? php Описание ошибки: Неверное строковое значение: '\ xF4t l' \ xE9 … 'на вставке php 2 Разница в многомерных массивах реализация следующих и задних кнопок для слайд-шоу Скопируйте категории из родительского настраиваемого продукта в простой дочерний продукт в Magento

Вычислить значение пропуска для данной записи для отсортированного поискового вызова

Я пытаюсь вычислить значение пропуска для данной записи в коллекции mongo db с использованием драйвера php. Поэтому, беря заданную запись, узнайте индекс этой записи во всей коллекции. Это возможно?

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

Это называется «прямой пейджинг», который представляет собой концепцию, которую вы можете использовать для «эффективной страницы» посредством результатов в «прямом» направлении при использовании «отсортированных» результатов.

Включена логика JavaScript (потому что она работает в оболочке), но не сложно перевести.

Концепция в целом:

{ "_id": 1, "a": 3 }, { "_id": 2, "a": 3 }, { "_id": 3, "a": 3 }, { "_id": 4, "a": 2 }, { "_id": 5, "a": 1 }, { "_id": 6, "a": 0 } 

Рассмотрите эти «уже отсортированные» документы (для удобства) в качестве примера результатов, которые мы хотим «на странице» на «два» элемента на странице.

В первом случае вы делаете что-то вроде этого:

 var lastVal = null, lastSeen = []; db.collection.find().sort({ "a": -1 }).limit(2).forEach(function(doc) { if ( lastVal != doc.a ) { lastSeen = []; } lastVal = doc.a; lastSeen.push( doc._id ); // do something useful with each document matched }); 

Теперь эти lastVal и lastSeen – это то, что вы храните в чем-то вроде «переменной сеанса», чем можно получить при следующем запросе с точки зрения веб-приложений или в противном случае что-то подобное, если нет.

То, что они должны содержать, это самое последнее значение, которое вы сортировали, и список «уникальных» значений _id которые были замечены, поскольку это значение не изменилось. Следовательно:

 lastVal = 3, lastSeen = [1,2]; 

Дело в том, что когда приходит запрос на «следующую страницу», вы хотите использовать эти переменные для чего-то вроде этого:

 var lastVal = 3, lastSeen = [1,2]; db.collection.find({ "_id": { "$nin": lastSeen }, "a": { "$lte": lastVal } }).sort({ "a": -1 }).limit(2).forEach(function(doc) { if ( lastVal != doc.a ) { lastSeen = []; } lastVal = doc.a; lastSeen.push( doc._id ); // do something useful with each document matched }); 

Что это значит, «исключить» все значения _id , которые записаны в lastSeen из списка результатов, а также убедиться, что все результаты должны быть «меньше или равно» (убывающий порядок) lastVal записанный для сортировки поле «a».

Это дает следующие два результата в коллекции:

 { "_id": 3, "a": 3 }, { "_id": 4, "a": 2 }, 

Но после обработки наши значения теперь выглядят так:

 lastVal = 2, lastSeen = [4]; 

Итак, теперь логика вытекает из того, что вам не нужно исключать другие значения _id увиденные ранее, так как вы действительно ищете только значения «a», чем «меньше или равно» lastVal и поскольку существует только «один», _id увиденное при этом значении, тогда только исключить это.

Это, конечно, дает следующую страницу, используя тот же код, что и выше:

 { "_id": 5, "a": 1 }, { "_id": 6, "a": 0 } 

Это самый эффективный способ «переслать страницу» по результатам в целом и особенно полезен для эффективного поискового вызова «отсортированных» результатов.

Если, однако, вы хотите «перейти» на страницу 20 или подобное действие на любом этапе, то это не для вас. Вы придерживаетесь традиционного .skip() и .limit() чтобы иметь возможность сделать это с помощью «номера страницы», поскольку нет другого рационального способа «рассчитать» это.

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

С другой стороны, если вы хотите «перейти на страницу», то «пропуск» – это ваш единственный реальный вариант, если вы не хотите создать «кеш» результатов. Но это еще одна проблема.