除了特殊注释外,本文的测试结果均基于 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. 基于python的Splash基本使用和负载均衡配置

    0.引言 由于在软件工程综合实践专题课程中,老师要求在博客园发表博客我自己做过的小项目,本博客为课程第一篇博客 本项目来源于寒假学习python网络爬虫时所做的实战小项目,经过精心挑选,选择了页面动态 ...

  2. iframe父页面和子页面获取元素和js变量

    父页面获取iframe页面元素和变量 获取方法:$("#id")[0].contentWindow.showInfo(): 获取元素:  $("#id").co ...

  3. ES9新内容概括

    本文主要介绍ES2018 新出的一些特性 1.异步迭代 允许 async/await 与 for-of 一起使用,以串行的方式运行异步操作,达到异步函数的迭代效果. async function pr ...

  4. git相关操作记录

    拉取远端并强制覆盖本地文件 有时候会出现想放弃本地修改的情况,那么只需要下面几行命令 git fetch --all git reset --hard origin/master git pull / ...

  5. C++标准模板库(STL)之Priority_Queue

    1.Priority_Queue的常用用法 priority_queue:优先队列,底层是使用堆来实现的.优先队列中,队首元素一定是当前队列中优先级最高的哪一个. a (优先级3),b(优先级4),c ...

  6. 从零开始搭建Webpack+react框架

    1.下载node.js Node.js官网下载 , 安装: 安装成功后在控制台输入node -v 可查看当前版本: $ node -v v10.15.0 输入npm -v查看npm版本: $ npm ...

  7. Json 数组传值

    1. var _content = {}; _content[_title] = _oldValue + ' -- > ' + statusVal; 2. var eventData = { T ...

  8. UIPath Level 1

    近日搬砖养家糊口,忙于项目,博客更新一度中断,自己都觉得委屈了. 培训视频看的眼睛耳朵疼,做完最后一个终极考试,哪儿哪儿都觉得不舒服~ 先来个截图,醒醒脑~ 今儿就歇下了~

  9. js--map函数的使用

    map( )  属于操作数组的方法. 包含三个参数,item,index,arr 看一份代码: let arr = [ {title:'aaa',hot:true}, {title:'fff',hot ...

  10. 关于C++中Hash的应用

    本文只介绍我们在C++中如何使用Hash这种数据结构达到我们编程的目的,有关Hash的概念和实现不做详谈. C++11新增了一类散列容器包括unordered_set, unordered_map, ...