.net下samus Mongo-Cshap 引擎中的find原生查询
一(问题)
在实现web前台把筛选条件提交到查询时。我们遇到了一些不大不小难题:
这是一个复杂的选择。而后台可接受的查询格式最终决定前台在提交的数据格式,根据目前所知的。mongoDb的samus引擎 提供了find,where方法,接受的参数很灵活:lambda/selector/javascript Fun,
而网上提供的资料相当少,对于我们.net一族,最常用的还是lambda表达式,但据说复杂的还是不能完美支持,同时会有一些效率问题。
而我们需要象原生支持的灵活参数,用于我们前台get请求时的url格式设计,这里介绍一下selector的查询方式。高人们可以直接飘过。
二,原理解决
首先我们看看mongo的原生查询(常用)
$gt : >
$lt : <
$gte: >=
$lte: <=
$ne : !=、<>
$in : in
$nin: not in
$all: all
$not: 反匹配(1.3.3及以上版本)
在看看samus引擎的 query operators 类 (Op.cs )
using MongoDB.Bson;
namespace MongoDB
{
/// <summary>
/// Staticly typed way of using MongoDB query operators.
/// </summary>
public class Op : Document
{
/// <summary>
/// Initializes a new instance of the <see cref="Op"/> class.
/// </summary>
/// <remarks>Only allow instantiation through static methods.</remarks>
private Op()
{ }
/// <summary>
/// Matches an object which is greater than the specified value.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value">The value.</param>
/// <returns></returns>
public static Op GreaterThan<T>(T value)
{
return (Op)new Op().Add("$gt", value);
}
/// <summary>
/// Matches an object which is greater than or equal to the specified value.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value">The value.</param>
/// <returns></returns>
public static Op GreaterThanOrEqual<T>(T value)
{
return (Op)new Op().Add("$gte", value);
}
/// <summary>
/// Matches an object which is less than the specified value.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value">The value.</param>
/// <returns></returns>
public static Op LessThan<T>(T value)
{
return (Op)new Op().Add("$lt", value);
}
/// <summary>
/// Matches an object which is less than or equal to the specified value.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value">The value.</param>
/// <returns></returns>
public static Op LessThanOrEqual<T>(T value)
{
return (Op)new Op().Add("$lte", value);
}
/// <summary>
/// Matches an object which does not equal the specified value.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value">The value.</param>
/// <returns></returns>
public static Op NotEqual<T>(T value)
{
return (Op)new Op().Add("$ne", value);
}
/// <summary>
/// Matches an array which has one of the specified values.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="values">The values.</param>
/// <returns></returns>
public static Op In<T>(params T[] values)
{
return (Op)new Op().Add("$in", values);
}
/// <summary>
/// Matches an array which does not have any of the specified values.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="values">The values.</param>
/// <returns></returns>
public static Op NotIn<T>(params T[] values)
{
return (Op)new Op().Add("$nin", values);
}
/// <summary>
/// Matches an array which has all of the specified values.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="values">The values.</param>
/// <returns></returns>
public static Op All<T>(params T[] values)
{
return (Op)new Op().Add("$all", values);
}
/// <summary>
/// Modulus operator.
/// </summary>
/// <param name="denominator">The denominator.</param>
/// <param name="result">The result.</param>
/// <returns></returns>
public static Op Mod(int denominator, int result)
{
return (Op)new Op().Add("$mod", new[] { denominator, result });
}
/// <summary>
/// Matches any array with the specified number of elements
/// </summary>
/// <param name="size">The size.</param>
/// <returns></returns>
public static Op Size(int size)
{
return (Op)new Op().Add("$size", size);
}
/// <summary>
/// Check for existence of a field.
/// </summary>
/// <returns></returns>
public static Op Exists()
{
return (Op)new Op().Add("$exists", true);
}
/// <summary>
/// Check for lack of existence of a field.
/// </summary>
/// <returns></returns>
public static Op NotExists()
{
return (Op)new Op().Add("$exists", false);
}
/// <summary>
/// Matches values based on their bson type.
/// </summary>
/// <param name="bsonType">Type of the bson.</param>
/// <returns></returns>
public static Op Type(BsonType bsonType)
{
return (Op)new Op().Add("$type", (int)bsonType);
}
/// <summary>
/// Sends the Javascript expressiosn to the server.
/// </summary>
/// <param name="javascript">The javascript.</param>
/// <returns></returns>
public static Op Where(string javascript)
{
if(javascript == null)
throw new ArgumentNullException("javascript");
return (Op)new Op().Add("$where", new Code(javascript));
}
/// <summary>
/// Implements the operator &. This is used for conjunctions.
/// </summary>
/// <param name="op1">The op1.</param>
/// <param name="op2">The op2.</param>
/// <returns>The result of the operator.</returns>
public static Op operator &(Op op1, Op op2)
{
return (Op)new Op().Merge(op1).Merge(op2);
}
/// <summary>
/// Implements the operator !. This is used for the meta operator $not.
/// </summary>
/// <param name="op">The op.</param>
/// <returns>The result of the operator.</returns>
public static Op operator !(Op op)
{
return (Op)new Op().Add("$not", op);
}
}
}
OK!很清楚了,下面是具体用法
//得到collection
IMongoCollection<TEntity> collection= db.GetCollection<TEntity>();//一般查询
collection.Find(new{name="张三"});
collection.Find(new{name="张三",sex="女"}); //and的关系//js查询
string jsStr = @"
function(){return this.name == '张三' || this.name == '李四';
}
";
collection.where(jsStr); //这回可以or了。js查询很强大,支持正则表达式,能解决like查询,请自行发挥//涉及op的查询
collection.Find((Op.Where(jsStr)); //使用上面的jsFunction
collection.Find(new{age=Op.GreaterThan(18)}); //age>18
collection.Find(new{age=Op.GreaterThan(18).LessThan(30)}); // 30>age>18
collection.Find(new{age=Op.In(18,28,38)}); //age==18 || age==28 || age==38
collection.Find(new{comment=Op.All("高","帅","钱多")}); //不做解释了自己查 $all
三,最终实现
最后定了一个规则,前台get字符串类似于 fieldA:xxxx;fieldB:xxxx 这里的xxxx是正则表达式,后台生成javascript的function字串,然后....
四,疑问
a. javascript 查询,可以有多复杂,其机制是什么? 效率如何?
经试验,只对第一个function有效,不能闭包
转载于:https://www.cnblogs.com/whegroup/archive/2011/04/18/2014496.html
.net下samus Mongo-Cshap 引擎中的find原生查询相关推荐
- mongo存储引擎那些事(一):硬盘数据结构
目录 LSM Tree WireTiger引擎基本数据结构 wiredtiger引擎定义的磁盘数据结构 插入多条数据后 作为了一个从事了7-8年开发经验的老coder,之前接触的数据库都是关系型数据库 ...
- 元宇宙开发:你在虚幻引擎中的第一个虚拟现实游戏
了解如何开发零编程背景的Oculus Quest游戏 你会学到什么 为Oculus Quest构建应用程序 设计和开发虚拟现实游戏 在虚幻引擎中工作 使用材料和纹理 优化内容,实现移动和虚拟现实游戏的 ...
- 跟着石头哥哥学cocos2d-x(三)---2dx引擎中的内存管理模型
2019独角兽企业重金招聘Python工程师标准>>> 2dx引擎中的对象内存管理模型,很简单就是一个对象池+引用计数,本着学好2dx的好奇心,先这里开走吧,紧接上面两节,首先我们看 ...
- 【Android 插件化】使用 PluginKiller 帮助应用开发者规避发布的 APK 安装包被作为插件的风险 ( 验证应用是否运行在插件化引擎中 )
文章目录 前言 一.应用开发者规避 APK 安装包被作为插件 二.检测插件化环境 1.检查 AndroidManifest.xml 清单文件 2.检查 运行时 信息 3.检查生成的目录 4.检查组件 ...
- 为什么 select count(*) from t,在 InnoDB 引擎中比 MyISAM 慢?
统计一张表的总数量,是我们开发中常有的业务需求,通常情况下,我们都是使用 select count(*) from t SQL 语句来完成.随着业务数据的增加,你会发现这条语句执行的速度越来越慢,为什 ...
- 实践 | Kylin在滴滴OLAP引擎中的应用
2019独角兽企业重金招聘Python工程师标准>>> 本文转载自 AI前线 作者 | 滴滴数据平台团队 编辑 | Vincent AI 前线导读:企业的生产活动会产生各种各样的数据 ...
- 3D游戏的照明设计理论,第4部分:如何在游戏引擎中照亮游戏世界
从更一般和更概念的角度来看,这是有关我如何处理游戏照明的系列文章的一部分.我在Unity中构建了大部分示例,但这通常适用于任何3D游戏引擎,其中大多数具有类似的照明工具. 我们开始思考了有关光照的文化 ...
- 浅谈surging服务引擎中的rabbitmq组件和容器化部署
1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...
- 在MySQL的InnoDB存储引擎中count(*)函数的优化
转载自 在MySQL的InnoDB存储引擎中count(*)函数的优化 写这篇文章之前已经看过了很多数据库方面的优化内容,大部分都是加索引.使用事务.要什么select什么等等.然而,只是停留在阅读 ...
最新文章
- RecycleView的notifyItemRemoved使用注意
- SEL | 植物通过根系分泌物招募假单孢菌协助抵抗地上部病原菌侵染
- 上古神器之Vim编辑器
- 计算机对中断的处理是在用户态下进行的,电大本科生作业系统作业3与答案.doc...
- s4800扫描电镜的CSS3_Hitachi S-4800型场发射扫描电子显微镜+能谱
- 【转】利用python的KMeans和PCA包实现聚类算法
- restTemplate配置及使用
- 大数据分析平台的作用有什么
- 拓端tecdat|TensorFlow 2.0 keras开发深度学习模型实例:多层感知器(MLP),卷积神经网络(CNN)和递归神经网络(RNN)
- 信息安全技术及应用 常规加密技术
- H桥和NMOS,PMOS理解
- win10设置右键菜单打开cmd
- jupyter代码无法运行
- 7.20-7.26 字节推荐算法(DATA-EDU)5道面试题分享
- 互联网思维到底是什么——移动浪潮下的新商业逻辑
- git 创建本地分支及远程分支并且关联分支
- 优秀网页设计:25个精美的旅游网站设计示例
- 访问WebLogic For AIX忽快忽慢的困惑——续篇
- 帝国cms模板html文件夹,帝国CMS模板建站e文件夹各个文件功能说明
- DSRN——Image Super-Resolution via Dual-State Recurrent Network
热门文章
- ListView下拉刷新和上拉加载原理
- bugzilla dbd-mysql_Windows上配置bugzilla.doc
- hssfrow 单元格样式_poi的各种单元格样式以及一些常用的配置
- [Pro]斐波那契数列阿【斐波那契数列】
- 动手学习深度学习的PDF电子版
- sharepoint 列表查询范围
- ubuntu:nodejs安装
- 详解linux netstat输出的网络连接状态信息
- Spring 应用开发框架 Spring Boot 2.3.0 最新版本发布
- 403 常见原因 java_科普 httpClient 403 Forbidden (JAVA方向分析)