如何在Mongo数据库中简化过滤

时间:2015-08-10 18:58:31

标签: php mongodb

我试图在Mongo数据库中使用两个参数(名称和ID)来过滤报告。我现在设置它的方式是:

// 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, []);
        }                
}

我想知道是否有一种简化方法,以便插入可以在没有多个if语句的情况下进行一次。

1 个答案:

答案 0 :(得分: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总是使用_id一样。因此,考虑到当存在此密钥时,所有其他可能的查询参数都会变得多余,除非您真的"真的"想要检查是否使用对象的其他正确属性显示了正确的标识符。