Длина значения длины строки в mongoDB

Тип данных поля – String. Я хотел бы получить данные, где длина имени поля больше 40.

Я пробовал эти запросы, но возвращал ошибку. 1.

db.usercollection.find( {$where: "(this.name.length > 40)"} ).limit(2); output :error: { "$err" : "TypeError: Cannot read property 'length' of undefined near '40)' ", "code" : 16722 } 

это работает в 2.4.9. Но моя версия 2.6.5

3 Solutions collect form web for “Длина значения длины строки в mongoDB”

Для MongoDB 3.6 и новее:

Оператор $expr допускает использование выражений агрегации в языке запросов, поэтому вы можете использовать использование оператора $strLenCP для проверки длины строки следующим образом:

 db.usercollection.find({ "name": { "$exists": true }, "$expr": { "$gt": [ { "$strLenCP": "$name" }, 40 ] } }) 

Для MongoDB 3.4 и новее:

Вы также можете использовать структуру агрегации с оператором конвейера $redact который позволяет вам выполнить логическое условие с помощью оператора $cond и использовать специальные операции $$KEEP для «сохранения» документа, где логическое условие истинно или $$PRUNE «удалить» документ, в котором условие было ложным.

Эта операция похожа на наличие $project конвейера, который выбирает поля в коллекции и создает новое поле, которое содержит результат из запроса логического условия, а затем последующее $match , за исключением того, что $redact использует один этап конвейера, который больше эффективный.

Что касается логического условия, существуют операторы агрегирования строк, которые вы можете использовать оператор $strLenCP для проверки длины строки. Если длина равна $gt указанному значению, то это истинное соответствие, и документ «сохраняется». В противном случае он «обрезается» и отбрасывается.


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

 db.usercollection.aggregate([ { "$match": { "name": { "$exists": true } } }, { "$redact": { "$cond": [ { "$gt": [ { "$strLenCP": "$name" }, 40] }, "$$KEEP", "$$PRUNE" ] } }, { "$limit": 2 } ]) 

Если вы используете $where , попробуйте свой запрос без прилагаемых скобок:

 db.usercollection.find({$where: "this.name.length > 40"}).limit(2); 

Лучшим запросом было бы проверить существование поля и затем проверить длину:

 db.usercollection.find({name: {$type: 2}, $where: "this.name.length > 40"}).limit(2); 

или:

 db.usercollection.find({name: {$exists: true}, $where: "this.name.length > 40"}).limit(2); 

MongoDB оценивает non $where выполняются операции запроса до $where выражения и non $where запросы запроса могут использовать индекс. Более высокая производительность – сохранить длину строки в качестве другого поля, а затем вы можете индексировать или искать на ней; применение $where будет намного медленнее по сравнению с этим. Рекомендуется использовать выражения JavaScript и оператор $where в качестве последнего средства, когда вы не можете структурировать данные каким-либо другим способом или когда вы имеете дело с небольшим подмножеством данных.


Другой и более быстрый подход, который позволяет избежать использования оператора $where является оператором $regex . Рассмотрим следующий шаблон, который ищет

 db.usercollection.find({"name": {"$type": 2, "$regex": /^.{41,}$/}}).limit(2); 

Примечание. Из документов :

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

Регулярное выражение является «префиксным выражением», если оно начинается с каретки (^) или левого якоря (\A) , за которым следует строка простых символов. Например, regex /^abc.*/ будет оптимизирован путем сопоставления только со значениями из индекса, начинающегося с abc .

Кроме того, в то время как /^a/, /^a.*/, и /^a.*$/ соответствуют эквивалентным строкам, они имеют разные характеристики производительности. Все эти выражения используют индекс, если существует соответствующий индекс; однако, /^a.*/ и /^a.*$/ работают медленнее. /^a/ может остановить сканирование после сопоставления префикса.

У меня был похожий сценарий, но в моем случае строка не является атрибутом 1-го уровня. Он находится внутри объекта. Здесь я не нашел подходящего ответа. Поэтому я решил поделиться своим решением со всеми вами (надеюсь, это поможет любому, у кого есть подобные проблемы).

 Parent Collection { "Child": { "name":"Random Name", "Age:"09" } } 

Пример: если нам нужно получить только коллекции, длина которых имеет имя ребенка более 10 символов.

  db.getCollection('Parent').find({$where: function() { for (var field in this.Child.name) { if (this.Child.name.length > 10) return true; } }}) 

обновленная версия Mongo 4.0, она становится проще и понятнее:

 find({name: { $gt: 40 }}, function(err, posts){ res.render('blog', {posts:posts}); // your code here }); 
  • Удалить расширение файла из строки имени файла
  • Выделить выбранную строку ListView
  • Получить индекс n-го вхождения строки?
  • Строка для enums в C ++
  • Как отрегулировать ведущее / завершающее пробелы стандартным образом?
  • Байт Java-массива с массивом строк в байт
  • Конкатенация строк в C, какой метод более эффективен?
  • Конкатенация строк: оператор concat () vs "+"
  • Команда не обнаружила ошибку в присвоении переменной Bash
  • Самый эффективный способ конкатенации строк?
  • Как обрезать пробелы?
  • Interesting Posts

    Как новый Backup and Sync обрабатывает существующих пользователей Google Диска?

    Как я могу сортировать строку текста, за которой следует число, используя LINQ

    Все параметры загрузки – это примерный цикл

    Как действительно изолировать таблицы стилей в расширении Google Chrome?

    установить / удалить APK программно (PackageManager vs Intents)

    Как обнаружить USB-накопитель подключен?

    Разница между клавишами h: и h: commandButton

    IntelliJ и Tomcat … измененные файлы не распознаются автоматически Tomcat

    Как установить значение Spinner по умолчанию null?

    Как проверить, закрыто ли соединение TcpClient?

    Как вставить элемент после другого элемента в JavaScript без использования библиотеки?

    Создайте несколько streamов для работы, затем подождите, пока все закончится

    Решения для резервного копирования Windows Home Server

    Запуск программ путем ввода некоторых псевдонимов в Windows

    Три пальца проведите пальцем по экрану между окнами

    Давайте будем гением компьютера.