除了特殊注释外,本文的测试结果均基于 spring-data-mongodb:1.10.6.RELEASE(spring-boot-starter:1.5.6.RELEASE),MongoDB 3.0.6


一:单纯的主从关系

  按照我们多年的mvc经验,所有的方法的调用都应该遵循一个从上到下的关系,没有遇到过dao层调service层的。

  所以主观上我们需要确认一个顺序,是runCommand封装了集合操作函数,还是集合操作函数封装了runCommand?

  这里我们进入mongo.exe,通过方法的源码来看看(js中所有的方法不加小括号时都可以直接打印出该方法的代码)

> db.runCommand
function ( obj, extra ){
if ( typeof( obj ) == "string" ){
var n = {};
n[obj] = 1;
obj = n;
if ( extra && typeof( extra ) == "object" ) {
for ( var x in extra ) {
n[x] = extra[x];
}
}
}
return this.getCollection( "$cmd" ).findOne( obj );
}

  runComman的底层使用findOne,很完美的主从调用关系,符合了我们的代码分层审美。

二、命令&方法,蛋和鸡

  接下来我们来看一个异类:aggregate。

> db.user.aggregate
function (pipeline, extraOpts) {
if (!(pipeline instanceof Array)) {
// support legacy varargs form. (Also handles db.foo.aggregate())
pipeline = argumentsToArray(arguments)
extraOpts = {}
}
else if (extraOpts === undefined) {
extraOpts = {};
} var cmd = {pipeline: pipeline};
Object.extend(cmd, extraOpts); if (!('cursor' in cmd)) {
// implicitly use cursors
cmd.cursor = {};
} var res = this.runCommand("aggregate", cmd);
//...此处省去了一些无关代码,可自行下载3.0.06版本的mongo查看
return res;
}

  这里调用的runCommand不会就是那个runCommand吧?,让我们将this替换为方法的调用对象db.user。(关于js中this指代的对象建议阅读王福朋的深入理解javascript的原型和闭包)

> db.user.runCommand
function ( cmd , params ){
if ( typeof( cmd ) == "object" )
return this._db._dbCommand( cmd ); var c = {};
c[cmd] = this.getName();
if ( params )
Object.extend( c , params );
return this._db._dbCommand( c );
}

  让我们再替换掉this,继续往下看。

> db.user._db._dbCommand
function ( obj, extra ){
if ( typeof( obj ) == "string" ){
var n = {};
n[obj] = 1;
obj = n;
if ( extra && typeof( extra ) == "object" ) {
for ( var x in extra ) {
n[x] = extra[x];
}
}
}
return this.getCollection( "$cmd" ).findOne( obj );
}

  db._collection_.aggregate()绕了一大圈,又回到了db.$cmd.findOne()。为什么不让aggregate直接调用findOne,再让db.runCommand{{"aggregate":"_collection_","pipeline":[]}}调用db._collection_.aggregate?这种鸡生蛋,蛋生鸡的结构,后期又该如何快速的进行版本升级?这样做的原因我们在第四章 MONGO中的特殊集合$CMD 中会讲。现在我们先记住aggregate的这种调用模式,然后研究在spring-data-mongodb中,该从哪一层入手使用原生的aggregate查询。


目录

  一:spring-data-mongodb 使用原生aggregate语句

  二:mongo的runCommand与集合操作函数的关系

  三:spring-data-mongodb与mongo shell的对应关系

  四:mongo中的游标与数据一致性的取舍

  

mongo的runCommand与集合操作函数的关系的更多相关文章

  1. oracle之集合操作函数---minus、union、intersect

    集合操作符专门用于合并多条select语句的结果,包括:UNION,UNION ALL,INTERSECT,MINUS.当使用集合操作函数时,需保证数据集的字段数据类型和数目一致. 使用集合操作符需要 ...

  2. Oracle集合操作函数:union、intersect、minus

    [转]Oracle集合操作函数:union.intersect.minus 集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINU ...

  3. 【转】Oracle集合操作函数:union、intersect、minus

    集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINUS.当使用集合操作符时,必须确保不同查询的列个数和数据类型匹配. 集合操作符 ...

  4. SQL使用总结——集合操作函数

    Oracle中集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINUS.当使用集合操作符时,必须确保不同查询的列个数和数据类型匹配 ...

  5. Oracle集合操作函数:Union、Union All、Intersect、Minus

    Union.对两个结果集进行并集操作.不包含反复行,同一时候进行默认规则的排序: Union All.对两个结果集进行并集操作,包含反复行.不进行排序: Intersect,对两个结果集进行交集操作. ...

  6. python numpy 数据集合操作函数

    arrarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])arr1array([0, 1, 2, 3, 4])np.intersect1d(arr,arr1)#计算数组ARR A ...

  7. python 集合、函数和文件操作

    1.set集合 set集合是一个无序.不可重复.可嵌套的序列,基本功能是进行成员关系测试和删除重复元素,可以使用大括号({})或者 set()函数创建集合,注意:创建一个空集合必须用 set() 而不 ...

  8. python学习笔记-(七)python基础--集合、文件操作&函数

    本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...

  9. day3-Python集合、函数、文件操作,python包的概念

    本节大纲: 1 python程序由包(package).模块(module)和函数组成.包是由一系列模块组成的集合.模块是处理某一类问题的函数和类的集合. 2 包就是一个完成特定任务的工具箱. 3 包 ...

随机推荐

  1. 蚂蚁风险大脑亮相ATEC城市峰会:为数字经济时代做好“安全守护”

    2019年1月4日,以“数字金融新原力(The New Force of Digital Finance)”为主题的蚂蚁金服ATEC城市峰会在上海隆重举行.大会聚焦金融数字化转型,分享新技术的发展趋势 ...

  2. 2>&1的意思

    2>&1的意思就是将标准错误也输出到标准输出当中.

  3. Asp.net core Identity + identity server + angular 学习笔记 (第三篇)

    register -> login 讲了 我们来讲讲 forgot password -> reset password  和 change password 吧 先来 forgot pa ...

  4. printf打印输出

    int PrintVal = 9;    /*按整型输出,默认右对齐*/    printf("%d\n",PrintVal);    /*按整型输出,补齐4位的宽度,补齐位为空格 ...

  5. ubuntu18.04.2LTS下如何用五笔输入法 --Linux

    ubuntu18.04.2LTS下自带五笔输入法,不用去单独下载 1.在设置中找到区域和语言 2.点击加号添加输入源 3.选择,选择「汉语」 4.选择「极点五笔」 开始你的五笔输入法之旅…… 友情链接 ...

  6. bootstrap-editable实现bootstrap-table行内编辑

    bootstrap-editable行内编辑效果如下: 需要引入插件 列初始化代码,为可编辑的列添加editable属性: columns = [ { title: '文件名', field: 'Na ...

  7. 版本控制,django缓存,跨域问题解决

    复习 分页: 1. 简单分页 2. 偏移分页 3. 加密分页 解析器:客户处理前端提交来的数据 urlencode: body体中的数据格式: key=value& formdata编码:为区 ...

  8. post传递中文时,可以使用urlEncode编码进行转码

    http://tool.chinaz.com/tools/urlencode.aspx

  9. one list to muti list

    List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8); List<List<Integer> ...

  10. nextcloud大文件无法上传

    I think that if u got a small /tmp like i had u cant upload big file…My /tmp = 462M so i can upload ...