Think/Db/Driver/Mongo.php
protected function parseWhereItem($key, $val)
    {
        $query = [];
        if (is_array($val)) {
            if (is_string($val[0])) {
                $con = strtolower($val[0]);
                if (in_array($con, ['neq', 'ne', 'gt', 'egt', 'gte', 'lt', 'lte', 'elt'])) {
                    // 比较运算
                    $k = '$'.$this->comparison[$con];
                    $query[$key] = [$k => $val[1]];
                } elseif ('like' == $con) {
                    // 模糊查询 采用正则方式
                    $query[$key] = new \MongoRegex("/".$val[1]."/");
                } elseif ('mod' == $con) {
                    // mod 查询
                    $query[$key] = ['$mod' => $val[1]];
                } elseif ('regex' == $con) {
                    // 正则查询
                    $query[$key] = new \MongoRegex($val[1]);
                } elseif (in_array($con, ['in', 'nin', 'not in'])) {
                    // IN NIN 运算
                    $data = is_string($val[1]) ? explode(',', $val[1]) : $val[1];
                    $k = '$'.$this->comparison[$con];
                    $query[$key] = [$k => $data];
                } elseif ('all' == $con) {
                    // 满足所有指定条件
                    $data = is_string($val[1]) ? explode(',', $val[1]) : $val[1];
                    $query[$key] = ['$all' => $data];
                } elseif ('between' == $con) {
                    // BETWEEN运算
                    $data = is_string($val[1]) ? explode(',', $val[1]) : $val[1];
                    $query[$key] = ['$gte' => $data[0], '$lte' => $data[1]];
                } elseif ('not between' == $con) {
                    $data = is_string($val[1]) ? explode(',', $val[1]) : $val[1];
                    $query[$key] = ['$lt' => $data[0], '$gt' => $data[1]];
                } elseif ('exp' == $con) {
                    // 表达式查询
                    $query['$where'] = new \MongoCode($val[1]);
                } elseif ('exists' == $con) {
                    // 字段是否存在
                    $query[$key] = ['$exists' => (bool)$val[1]];
                } elseif ('size' == $con) {
                    // 限制属性大小
                    $query[$key] = ['$size' => intval($val[1])];
                } elseif ('type' == $con) {
                    // 限制字段类型 1 浮点型 2 字符型 3 对象或者MongoDBRef 5 MongoBinData 7 MongoId 8 布尔型 9 MongoDate 10 NULL 15 MongoCode 16 32位整型 17 MongoTimestamp 18 MongoInt64 如果是数组的话判断元素的类型
                    $query[$key] = ['$type' => intval($val[1])];
                } else {
                    $query[$key] = $val;
                }

                return $query;
            }
        }
        $query[$key] = $val;

        return $query;
    }
protected function parseWhereItem($key, $val)
    {
        $query = [];
        if (is_array($val)) {
            if (is_string($val[0])) {
                $con = strtolower($val[0]);
                if (in_array($con, ['neq', 'ne', 'gt', 'egt', 'gte', 'lt', 'lte', 'elt'])) {
                    // 比较运算
                    $k = '$'.$this->comparison[$con];
                    $query[$key] = [$k => $val[1]];
                } elseif ('like' == $con) {
                    // 模糊查询 采用正则方式
                    $query[$key] = new \MongoRegex("/".$val[1]."/");
                } elseif ('mod' == $con) {
                    // mod 查询
                    $query[$key] = ['$mod' => $val[1]];
                } elseif ('regex' == $con) {
                    // 正则查询
                    $query[$key] = new \MongoRegex($val[1]);
                } elseif (in_array($con, ['in', 'nin', 'not in'])) {
                    // IN NIN 运算
                    $data = is_string($val[1]) ? explode(',', $val[1]) : $val[1];
                    $k = '$'.$this->comparison[$con];
                    $query[$key] = [$k => $data];
                } elseif ('all' == $con) {
                    // 满足所有指定条件
                    $data = is_string($val[1]) ? explode(',', $val[1]) : $val[1];
                    $query[$key] = ['$all' => $data];
                } elseif ('between' == $con) {
                    // BETWEEN运算
                    $data = is_string($val[1]) ? explode(',', $val[1]) : $val[1];
                    $query[$key] = ['$gte' => $data[0], '$lte' => $data[1]];
                } elseif ('not between' == $con) {
                    $data = is_string($val[1]) ? explode(',', $val[1]) : $val[1];
                    $query[$key] = ['$lt' => $data[0], '$gt' => $data[1]];
                } elseif ('exp' == $con) {
                    // 表达式查询
                    $query['$where'] = new \MongoCode($val[1]);
                } elseif ('exists' == $con) {
                    // 字段是否存在
                    $query[$key] = ['$exists' => (bool)$val[1]];
                } elseif ('size' == $con) {
                    // 限制属性大小
                    $query[$key] = ['$size' => intval($val[1])];
                } elseif ('type' == $con) {
                    // 限制字段类型 1 浮点型 2 字符型 3 对象或者MongoDBRef 5 MongoBinData 7 MongoId 8 布尔型 9 MongoDate 10 NULL 15 MongoCode 16 32位整型 17 MongoTimestamp 18 MongoInt64 如果是数组的话判断元素的类型
                    $query[$key] = ['$type' => intval($val[1])];
                } else {
                    $query[$key] = $val;
                }

                return $query;
            }
        }
        $query[$key] = $val;

        return $query;
    }
where子单元分析
@param string $key
@param mixed $val
@return array