Как совместить строку во всем значении поля в mongodb [duplicate]

Быстрое исправление для пользователей Sublime:

  1. Нажмите Ctrl-H для доступа к Find and Replace
  2. В Find: Type 4 space
  3. In Replace : Скопируйте и вставьте вкладку где-нибудь в своем коде. Нажмите «Заменить все»
10
задан Blakes Seven 3 July 2015 в 06:46
поделиться

2 ответа

Вы правы в определенном утверждении документа BSON, это не XML-документ. Поскольку XML загружается в древовидную структуру, состоящую из «узлов», поиск на арбитальном ключе довольно прост.

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

Тем не менее это можно сделать. Но, конечно, это означает, что на сервере выполняется рекурсивный процесс, и это означает, что обработка JavaScript с помощью $where .

В качестве примера базовой оболочки, но общий function просто строковый аргумент для оператора $where всюду:

db.collection.find(
  function () {
    var findKey = "find-this",
        findVal = "please find me";

    function inspectObj(doc) {
      return Object.keys(doc).some(function(key) {
        if ( typeof(doc[key]) == "object" ) {
          return inspectObj(doc[key]);
        } else {
          return ( key == findKey && doc[key] == findVal );
        }
      });
    }
    return inspectObj(this);
  }
)

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

JavaScript .some() гарантирует, что найденное совпадение будет найдено из функции поиска, дающей результат true и возвращающий объект, где этот «ключ / значение» присутствовал на некоторой глубине.

Обратите внимание, что $where по существу означает перемещение всей вашей коллекции, если только не существует какой-либо другой действительный фильтр запросов, который может быть применен к «индексу» в коллекции.

Так что используйте с осторожностью или вообще не работайте и просто работайте с реструктуризацией данных в более работоспособную форму.

Но это даст вам ваш матч.

9
ответ дан Blakes Seven 26 August 2018 в 17:28
поделиться

Вот один из примеров, который я использую для рекурсивного поиска значения Key в любом месте в структуре документа:

db.getCollection('myCollection').find({

    "$where" : function(){

        var searchKey = 'find-this';
        var searchValue = 'please find me';

        return searchInObj(obj);

        function searchInObj(obj){                            
          for(var k in obj){       
            if(typeof obj[k] == 'object' && obj[k] !== null){
              if(searchInObj(obj[k])){
                return true;
              }
            } else {
              if(k == searchKey && obj[k] == searchValue){
                return true;
              }
            }          
          }                         
          return false;
        }       
    }    
})
2
ответ дан Vaclav Kohout 26 August 2018 в 17:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: