sql的where条件转换成mongdb筛选条件
解析字符串 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筛选条件的更多相关文章
- 关于sql where id in 转换成数据类型 int 时失败(转)
有执行sql条件语句where id in(@参数)的时候,如果处理不当,就会出现问题:如下面这个存储过程: alter proc Web_gettwtwgoldgameserverGoldSell@ ...
- Sql中把datetime转换成字符串(CONVERT)(转)
一.回顾一下CONVERT()的语法格式: CONVERT (<data_ type>[ length ], <expression> [, style]) 二.这里注重说明一 ...
- Sql中把datetime转换成字符串(CONVERT)
一.回想一下CONVERT()的语法格式: CONVERT (<data_ type>[ length ], <expression> [, style]) 二.这里注重说明一 ...
- 将Microsoft SQL Server 2000数据库转换成MySQL数据库
1. 下载并安装MyODBC.(如果是XP请下载5.3的旧版本,8.x的新版本运行有问题) 2. 创建一个空的MySQL数据库. 3. 在Windows >> 控制面板 >> ...
- hibernate sql查询后对象转换成实体类
在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用 session.createSQLQuery(sql).setResultTransform ...
- sql中把时间转换成xx年xx月xx日
DECLARE @dt datetime SET @dt=GETDATE()--1.短日期格式:yyyy-m-d SELECT STUFF(STUFF(CONVERT(char(8),@dt,112) ...
- sql把字符数组转换成表
需求:把字符串1,2,3变成表里的行数据 方法:用自定义函数实现 /* 获取字符串数组的 Table */ from sysobjects where id = object_id('Get_StrA ...
- 使用SQL如何把用逗号等字符隔开的字符串转换成列表(转)
如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例: 比如有一个字符串,其值为:香港,张家港,北京,上海用SQL把这个字符串转换成列表的方法是: 1.方法一 WITH A AS (SELE ...
- 数据库表转换成javaBean对象小工具
package test.utils; import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter; ...
随机推荐
- RequireJS -Javascript模块化(一、简介)
1.认识RequireJS RequireJs官网(http://requirejs.org/)的描述: RequireJS is a JavaScript file and module loade ...
- RTT学习之线程
一 线程的创建和删除:rt_thread_create()创建的句柄,对应的删除rt_thread_delete(),注意线程的删除只是将线程的状态该为close,进入空闲任务才删除.rt_threa ...
- leetcode 175 Combine Two Tables join用法
https://leetcode.com/problemset/database/ ACM退役,刚好要学sql,一定要刷题才行,leetcode吧. 这一题,说了两个表,一个左一个右吧,左边的pers ...
- 快速排序算法的实现 && 随机生成区间里的数 && O(n)找第k小 && O(nlogk)找前k大
思路:固定一个数,把这个数放到合法的位置,然后左边的数都是比它小,右边的数都是比它大 固定权值选的是第一个数,或者一个随机数 因为固定的是左端点,所以一开始需要在右端点开始,找一个小于权值的数,从左端 ...
- Unity 改变游戏对象的Scale引起的不好结果
1. 当一个游戏对象的中心(它的x,y,z的交点) 不在它的正中间时,改变它的Scale时它的中心也会变的. 如图:这是用PlayMkaer做的,胶囊体碰到瓶子瓶子会碎,会在瓶子的中心位置那生成一个 ...
- (转)linux passwd批量修改用户密码
linux passwd批量修改用户密码 原文:http://blog.csdn.net/xuwuhao/article/details/46618913 对系统定期修改密码是一个很重要的安全常识, ...
- [一点一滴.NET]前台线程和后台线程
前台线程和后台线程就是通过线程实例的属性IsBackground=true or false来区分的. 新建一个线程是默认是后台线程. 前台线程全部执行完之后,才退出进程. 进程退出,所有的后台线程全 ...
- java语言编程实现两个时间相差多少天、多少小时、多少分、多少秒
不多说,直接上干货! DateDistance.java package zhouls.bigdata.DataFeatureSelection.test; import java.text.Date ...
- Linux网卡操作
单个网卡操作 [root@localhost ~]# ifdown eth0 #关闭网络 [root@localhost ~]# ifup eth0 #启动网络 网络服务: [root@localho ...
- DetachedCriteria用法
http://uule.iteye.com/blog/947923转载 在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查 ...