解析字符串 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. 转 PyCharm 进行调试 以及怎么熟悉一个已经成熟的项目的代码和断点 以及 jetBrains pycharm快捷键

    https://blog.csdn.net/guider2334/rss/list Ctrl + Q 现实document视图,查看选择元素的详细信息        (重要) Ctrl + Alt + ...

  2. Python开源库

    某些情况下,pip install xxx找不到,而且在 官方库 也找不到. 那么 第三方库 就派上用场了.

  3. 揭秘企业级web负载均衡完美架构

    相信很多朋友对企业级的负载均衡高可用实例非常感兴趣,此篇文章根据成熟的线上环境而写,旨在帮助大家迅速架构一个企业级的负载均衡高可用的web环境. 此系统架构仅映射内网VIP的80及443端口于外网的J ...

  4. 前端如何做好SEO优化

    https://www.cnblogs.com/weiyf/p/9511021.html 一:什么是SEO? 搜索引擎优化(Search Engine Optimization),简称SEO.是按照搜 ...

  5. IIS下不能下载文件的docx文档,XLSX文档的设置方法(转)

    IIS下不能下载文件的docx文档,XLSX文档的设置方法 Office 2007的的界面风格默认格式中都是.DOCX,XLSX,PPTX等等后缀,连结中包含此类文件时,界面风格默认什么打不开的其实只 ...

  6. JavaScript 对象继承 OOP (三)

      对象继承 A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. JavaScript 语言的继承不通过 class (es6 中的class 不过是 ...

  7. switch 和 if...else if 的区别

     为什么很多人用  if...else..if   而不使用   switch 1,if...else...if 只是单纯地一个接一个比较:if...else可能每个条件都计算一遍: 2,switch ...

  8. Eclipse reference

    http://download.csdn.net/download/ling_min/4318719 http://www.qualityeclipse.com/eclipse-gef http:// ...

  9. Build 2017 | 今儿来说说火得不行的认知服务吧(内附微软开发者大会在线峰会报名地址)

    Everybody,新一期的 Build 2017 大会新技术详谈又来了,今天小编给大家带来了一个既智能又有趣的技术,你一定喜欢!不卖关子了,直奔我们本期的主题: [只需几行代码,就能让任何应用更智能 ...

  10. 为什么要使用TLSv1.2和System SSL?

    FTP 和 Telnet 正是核心联网应用程序的两个示例.为 System SSL 编程接口编码的供应商应用程序可以通过更改代码来利用这些新支持. 这是安全套接层 (SSL) 协议的最新版本,也是最为 ...