一(问题)

在实现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 System;
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 &amp;. 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原生查询相关推荐

  1. mongo存储引擎那些事(一):硬盘数据结构

    目录 LSM Tree WireTiger引擎基本数据结构 wiredtiger引擎定义的磁盘数据结构 插入多条数据后 作为了一个从事了7-8年开发经验的老coder,之前接触的数据库都是关系型数据库 ...

  2. 元宇宙开发:你在虚幻引擎中的第一个虚拟现实游戏

    了解如何开发零编程背景的Oculus Quest游戏 你会学到什么 为Oculus Quest构建应用程序 设计和开发虚拟现实游戏 在虚幻引擎中工作 使用材料和纹理 优化内容,实现移动和虚拟现实游戏的 ...

  3. 跟着石头哥哥学cocos2d-x(三)---2dx引擎中的内存管理模型

    2019独角兽企业重金招聘Python工程师标准>>> 2dx引擎中的对象内存管理模型,很简单就是一个对象池+引用计数,本着学好2dx的好奇心,先这里开走吧,紧接上面两节,首先我们看 ...

  4. 【Android 插件化】使用 PluginKiller 帮助应用开发者规避发布的 APK 安装包被作为插件的风险 ( 验证应用是否运行在插件化引擎中 )

    文章目录 前言 一.应用开发者规避 APK 安装包被作为插件 二.检测插件化环境 1.检查 AndroidManifest.xml 清单文件 2.检查 运行时 信息 3.检查生成的目录 4.检查组件 ...

  5. 为什么 select count(*) from t,在 InnoDB 引擎中比 MyISAM 慢?

    统计一张表的总数量,是我们开发中常有的业务需求,通常情况下,我们都是使用 select count(*) from t SQL 语句来完成.随着业务数据的增加,你会发现这条语句执行的速度越来越慢,为什 ...

  6. 实践 | Kylin在滴滴OLAP引擎中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 本文转载自 AI前线 作者 | 滴滴数据平台团队 编辑 | Vincent AI 前线导读:企业的生产活动会产生各种各样的数据 ...

  7. 3D游戏的照明设计理论,第4部分:如何在游戏引擎中照亮游戏世界

    从更一般和更概念的角度来看,这是有关我如何处理游戏照明的系列文章的一部分.我在Unity中构建了大部分示例,但这通常适用于任何3D游戏引擎,其中大多数具有类似的照明工具. 我们开始思考了有关光照的文化 ...

  8. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  9. 在MySQL的InnoDB存储引擎中count(*)函数的优化

    转载自  在MySQL的InnoDB存储引擎中count(*)函数的优化 写这篇文章之前已经看过了很多数据库方面的优化内容,大部分都是加索引.使用事务.要什么select什么等等.然而,只是停留在阅读 ...

最新文章

  1. RecycleView的notifyItemRemoved使用注意
  2. SEL | 植物通过根系分泌物招募假单孢菌协助抵抗地上部病原菌侵染
  3. 上古神器之Vim编辑器
  4. 计算机对中断的处理是在用户态下进行的,电大本科生作业系统作业3与答案.doc...
  5. s4800扫描电镜的CSS3_Hitachi S-4800型场发射扫描电子显微镜+能谱
  6. 【转】利用python的KMeans和PCA包实现聚类算法
  7. restTemplate配置及使用
  8. 大数据分析平台的作用有什么
  9. 拓端tecdat|TensorFlow 2.0 keras开发深度学习模型实例:多层感知器(MLP),卷积神经网络(CNN)和递归神经网络(RNN)
  10. 信息安全技术及应用 常规加密技术
  11. H桥和NMOS,PMOS理解
  12. win10设置右键菜单打开cmd
  13. jupyter代码无法运行
  14. 7.20-7.26 字节推荐算法(DATA-EDU)5道面试题分享
  15. 互联网思维到底是什么——移动浪潮下的新商业逻辑
  16. git 创建本地分支及远程分支并且关联分支
  17. 优秀网页设计:25个精美的旅游网站设计示例
  18. 访问WebLogic For AIX忽快忽慢的困惑——续篇
  19. 帝国cms模板html文件夹,帝国CMS模板建站e文件夹各个文件功能说明
  20. DSRN——Image Super-Resolution via Dual-State Recurrent Network

热门文章

  1. ListView下拉刷新和上拉加载原理
  2. bugzilla dbd-mysql_Windows上配置bugzilla.doc
  3. hssfrow 单元格样式_poi的各种单元格样式以及一些常用的配置
  4. [Pro]斐波那契数列阿【斐波那契数列】
  5. 动手学习深度学习的PDF电子版
  6. sharepoint 列表查询范围
  7. ubuntu:nodejs安装
  8. 详解linux netstat输出的网络连接状态信息
  9. Spring 应用开发框架 Spring Boot 2.3.0 最新版本发布
  10. 403 常见原因 java_科普 httpClient 403 Forbidden (JAVA方向分析)