2015-08-10 2 views
0

Я пытаюсь отфильтровать отчет, используя два параметра (имя и идентификатор) в Mongo DB. Образом она у меня настроить сейчас это:Как оптимизировать фильтрацию в базе данных Mongo

// if both params are empty 
if ((empty($filterParams['name'])) && (empty($filterParams['id']))) { 
    $views = $mongoDb->selectCollection('views')->find([], []); 
} 
// if one of the two params are empty 
if ((!empty($filterParams['name'])) || (!empty($filterParams['id']))) { 
     // name is empty 
     if ((empty($filterParams['name']))) { 
      $idQuery = array('id' => (int)$filterParams['id']); 
      $views = $mongoDb->selectCollection('views')->find($idQuery, []); 
     } 
     // id is empty 
     if ((empty($filteredParams['id']))) { 
      $nameQuery = array('name' => $filterParams['name']); 
      $views = $mongoDb->selectCollection('views')->find($nameQuery, []); 
     } 
     // neither are empty 
     if ((!empty($filterParams['name'])) && (!empty($filterParams['id']))) { 
      $fullQuery = array('id' => (int)$filterParams['id'], 'name' => $filteredParams['name']); 
      $views = $mongoDb->selectCollection('views')->find($fullQuery, []); 
     }     
} 

мне было интересно, если есть способ, чтобы упорядочить это так, что вставка может быть сделано один раз без мультипликатора, если заявления.

ответ

1

Вы, конечно, перерабатываете очень простую проблему. Все, что вам действительно нужно сделать, это взять «filterParams» (который, скорее всего, из источника запроса), и преобразовать возможное «строковое» значение для «id» в «числовой» формат, который, по-видимому, ожидает ваша база данных код, написанный здесь).

// $filterParams = array()  // or it might be blank 
    $filterParams = array("id" => "1", "something" => "else"); 

    $query = array(); 

    foreach($filterParams as $key => $value) { 
    if ($key == "id") 
     $query[$key] = intval($value); 

    $query[$key] = $filterParams[$key]; 

    } 

    $views = $mongoDb->selectCollection('views')->find($query); 

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

Фактически, тем более, что «filterParams», по-видимому, лишен других данных, вы можете просто изменить значения на месте, а не определять другую структуру.

// $filterParams = array()  // or it might be blank 
    $filterParams = array("id" => "1", "something" => "else"); 

    $query = array(); 

    foreach($filterParams as $key => $value) { 
    if ($key == "id") 
     $filterParams[$key] = intval($value); 
    } 

    $views = $mongoDb->selectCollection('views')->find($filterParams); 

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

То же самое JavaScript, например:

//var filterParams = {}; 

var filterParams = { 
    id: "1", 
    something: "here" 
}; 

Object.keys(filterParams).forEach(function(key) { 
    if (key == "id") 
    filterParams[key] = parseInt(filterParams[key]); 
}); 

db.collection.find(filterParams); 

Кроме того, «идентификатор» обычно представляет собой идентификатор, используемый для «уникального» значения для объекта, так же, как _id всегда используется MongoDB. Поэтому подумайте, что когда этот ключ присутствует, тогда все другие возможные аргументы запроса становятся избыточными, если только вы «действительно» не хотите проверить, что правильный идентификатор был представлен с другими правильными свойствами объекта.

+0

Спасибо за ваш ответ. Это то, что я искал. –

Смежные вопросы