解析字符串 filterModel1 and filterModel2 and (filterModel3 or filterModel4)

1.转换成mongo的筛选条件

 /// <summary>
/// where转换成mongo的查询条件
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string WhereToMongoWhere(string str)
{
str = (str.StartsWith("(")) ? str.Substring() : str;
str = (str.EndsWith(")")) ? str.Substring(, str.Length - ) : str;
if (str.StartsWith("("))
{
str = str.Substring();
}
if (str.EndsWith(")"))
{
str = str.Substring(, str.Length - );
}
var andMatch = Regex.Match(str, @"\band\b", RegexOptions.IgnoreCase);// str.search(/\band\b / i);
var orMatch = Regex.Match(str, @"\bor\b", RegexOptions.IgnoreCase);// str.search(/\bor\b / i);
var n = andMatch.Success ? andMatch.Index : -;
var n1 = orMatch.Success ? orMatch.Index : -;
var res_str = "";
if (n != - && n1 != -)
{ if (n < n1 && n != -)
{
//and
if (n != -)
{
var beforeString = str.Substring(, n).Trim();//str.slice(0, n);//截取下标0到下标n
var afterString = str.Substring(n + , str.Length - (n + ));//str.slice(n + 4, str.length); res_str = "\n \"$and\": [{\n" + WhereToMongoWhere(beforeString) + "\n },{" + WhereToMongoWhere(afterString) + "\n }]"; //No I18N
}
return res_str; }
else
{
//or
if (n1 != -)
{
var beforeString = str.Substring(, n1).Trim();// str.slice(0, n1);
var afterString = str.Substring(n1 + , str.Length - (n1 + ));//str.slice(n1 + 3, str.length); res_str = "\n \"$or\": [{\n" + WhereToMongoWhere(beforeString) + "\n },{" + WhereToMongoWhere(afterString) + "\n }]"; //No I18N
}
return res_str;
} }
else if (n1 == - && n != -)
{ var beforeString = str.Substring(, n).Trim();//str.slice(0, n);
var afterString = str.Substring(n + , str.Length - (n + ));//str.slice(n + 3, str.length); res_str = "\n \"$and\": [{\n" + WhereToMongoWhere(beforeString) + "\n },{" + WhereToMongoWhere(afterString) + "\n }]"; //No I18N
return res_str; }
else if (n == - && n1 != -)
{
var beforeString = str.Substring(, n1).Trim();//str.slice(0, n1);
var afterString = str.Substring(n1 + , str.Length - (n1 + ));//str.slice(n1 + 3, str.length); res_str = "\n \"$or\": [{\n" + WhereToMongoWhere(beforeString) + "\n },{" + WhereToMongoWhere(afterString) + "\n }]"; //No I18N
return res_str;
}
else
{
res_str = " " + CheckCases(str); //No I18N
return res_str;
}
}

2.筛选条件赋值

 /// <summary>
/// 条件赋值
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private static string CheckCases(string str)
{
string res_str = "";
string beforeString = "";
string afterString = "";
FilterModel f;
try
{
f = JsonConvert.DeserializeObject<FilterModel>(str);
}
catch (Exception ex)
{
throw ex;
}
beforeString = f.Field.Trim();
string valueType = f.Value.GetType().Name;
switch (f.QueryType)
{
case QueryType.EQ:
afterString = f.Value.ToString();
if (valueType == typeof(string).Name)
{
res_str = res_str + "\"" + beforeString + "\" : " + "\"" + afterString + "\"";
}
else
{
res_str = res_str + "\"" + beforeString + "\" : " + afterString;
}
break;
case QueryType.GTE:
afterString = f.Value.ToString();
if (valueType == typeof(string).Name)
{
res_str = res_str + "\"" + beforeString + "\":{ \"$gte\" : " + "\"" + afterString + "\"}"; //No I18N
}
else
{
res_str = res_str + "\"" + beforeString + "\":{ \"$gte\" : " + afterString + "}"; //No I18N }
break;
case QueryType.GT:
afterString = f.Value.ToString();
if (valueType == typeof(string).Name)
{
res_str = res_str + "\"" + beforeString + "\":{ \"$gt\" : " + "\"" + afterString + "\"}"; //No I18N
}
else
{
var after = double.Parse(afterString);
res_str = res_str + "\"" + beforeString + "\":{ \"$gt\" : " + after + "}"; //No I18N }
break;
case QueryType.LTE:
afterString = f.Value.ToString();
if (valueType == typeof(string).Name)
{
res_str = res_str + "\"" + beforeString + "\":{ \"$lte\" : " + "\"" + afterString + "\"}"; //No I18N
}
else
{
res_str = res_str + "\"" + beforeString + "\":{ \"$lte\" : " + afterString + "}"; //No I18N }
break;
case QueryType.LT:
afterString = f.Value.ToString();
if (valueType == typeof(string).Name)
{
res_str = res_str + "\"" + beforeString + "\":{ \"$lt\" : " + "\"" + afterString + "\"}"; //No I18N
}
else
{
res_str = res_str + "\"" + beforeString + "\":{ \"$lt\" : " + afterString + "}"; //No I18N }
break;
case QueryType.LIKE:
afterString = f.Value.ToString();
res_str = res_str + "\"" + beforeString + "\" : " + "/" + afterString + "/"; //No I18N
break;
case QueryType.IN:
case QueryType.NE:
if (valueType == typeof(JArray).Name)
{
JArray jArray = JsonConvert.DeserializeObject<JArray>(JsonConvert.SerializeObject(f.Value));
var firstValue = jArray.FirstOrDefault();
if (firstValue != null)
{
if (firstValue.Type.ToString() == typeof(String).Name)
{
afterString = string.Join("\",\"", jArray.ToObject<IEnumerable<string>>());
afterString = "\"" + afterString + "\"";
}
else
{
afterString = string.Join(",", jArray.ToObject<IEnumerable<string>>());
}
} res_str = res_str + "\"" + beforeString + "\": {"; //No I18N
if (f.QueryType == QueryType.IN)
{
res_str = res_str + "\"$in\": [" + afterString + "]}"; //No I18N
}
else
{
res_str = res_str + "\"$ne\": [" + afterString + "]}"; //No I18N
} }
break;
default:
afterString = f.Value.ToString();
if (valueType == typeof(string).Name)
{
res_str = res_str + "\"" + beforeString + "\" : " + "\"" + afterString + "\"";
}
else
{
res_str = res_str + "\"" + beforeString + "\" : " + afterString;
}
break; }
return res_str;
}

sql的where条件转换成mongdb筛选条件的更多相关文章

  1. 关于sql where id in 转换成数据类型 int 时失败(转)

    有执行sql条件语句where id in(@参数)的时候,如果处理不当,就会出现问题:如下面这个存储过程: alter proc Web_gettwtwgoldgameserverGoldSell@ ...

  2. Sql中把datetime转换成字符串(CONVERT)(转)

    一.回顾一下CONVERT()的语法格式: CONVERT (<data_ type>[ length ], <expression> [, style]) 二.这里注重说明一 ...

  3. Sql中把datetime转换成字符串(CONVERT)

    一.回想一下CONVERT()的语法格式: CONVERT (<data_ type>[ length ], <expression> [, style]) 二.这里注重说明一 ...

  4. 将Microsoft SQL Server 2000数据库转换成MySQL数据库

    1. 下载并安装MyODBC.(如果是XP请下载5.3的旧版本,8.x的新版本运行有问题) 2. 创建一个空的MySQL数据库. 3. 在Windows >> 控制面板 >> ...

  5. hibernate sql查询后对象转换成实体类

    在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用  session.createSQLQuery(sql).setResultTransform ...

  6. sql中把时间转换成xx年xx月xx日

    DECLARE @dt datetime SET @dt=GETDATE()--1.短日期格式:yyyy-m-d SELECT STUFF(STUFF(CONVERT(char(8),@dt,112) ...

  7. sql把字符数组转换成表

    需求:把字符串1,2,3变成表里的行数据 方法:用自定义函数实现 /* 获取字符串数组的 Table */ from sysobjects where id = object_id('Get_StrA ...

  8. 使用SQL如何把用逗号等字符隔开的字符串转换成列表(转)

    如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例: 比如有一个字符串,其值为:香港,张家港,北京,上海用SQL把这个字符串转换成列表的方法是: 1.方法一 WITH A AS (SELE ...

  9. 数据库表转换成javaBean对象小工具

    package test.utils; import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter; ...

随机推荐

  1. Python Numpy Array

    Numpy 是Python中数据科学中的核心组件,它给我们提供了多维度高性能数组对象. Arrays Numpy.array   dtype 变量 dtype变量,用来存放数据类型, 创建数组时可以同 ...

  2. SQL SEVER 数据库日志(Log)文件增长过快的处理

    SQL SERVER 2016数据库,50GB+的数据.有大量的增删和插入操作,数据库log文件变得异常的大,而且增长速度特别的快.周五log文件20GB,周一上班就成了200+GB了 因为数据库恢复 ...

  3. python_文件 处理

    一.字符编码 内存固定使用unicode编码 数据最先产生于内存中,是unicode格式,要想传输需要转成bytes格式 # unicode -------> enconde( u t f - ...

  4. TestNG的testng.xml配置概述

    TestNG提供的annotaions用来辅助定义测试类. TestNG的testng.xml配置文件用来辅助定义执行什么样的测试,即testng.xml更像是一个测试规划. testng.xml配置 ...

  5. jemeter、windox下安装教程

    JMeter是Apache软件基金会的产品,用于对静态和动态的资源(文件,Servlet,Perl脚本,Java对象,数据库和查询,FTP服务器等等)的性能进行测试,是一款很方便的测试软件. 系统:w ...

  6. docker~service将容器日志输出到fluentd

    我们把微小的服务发布到docker里,然后实现docker service启动它,保证了服务的高可用性,然后把服务产生的日志输出到fluentd,由它进行过滤和转发,存储到elasticsearch里 ...

  7. Tomcat安装和配置过程

    tomcat的下载.配置.启动方法.网上教程乱七八糟,还是自己mark一下备用吧. 一.官网下载Tomcat的压缩包 Tomcat是Apache软件基金会的一个开源项目.登录Apache官网即可找到下 ...

  8. spring boot 配置redis

    先配置属性: # database name spring.redis.database=0 # server host spring.redis.host=127.0.0.1 # server pa ...

  9. pat1045. Favorite Color Stripe (30)

    1045. Favorite Color Stripe (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  10. machine learning 线性回归实战

    matlab 线性回归实战 统一 输入时列向量 输出也是列向量 中间的过程可以出现行向量或者列向量,但是不能影响输入和输出为列向量 参数运算的输入都不会只是一个实数,要么是列向量,要么是一个矩阵 对于 ...