MongoDB for node.js developers 七周学习-最终测试小结(1)

MonogoDB官网上提供了许多免费课程,就选择了"MongoDB for node.js developers"学习。课程当然是英文的啦,不过有中文字幕~,每次课程后还有练习。七周的课程过去的很快,学到了不少的内容。借助着最终测试的题,做一次小结,省得自己不久后忘记(哎,记性差= =)

最后的测试一共有十道题,考察的内容分别是:1、查询 2、聚合 3、更新$addToSet 4、更新$inc 5、索引  6、添加优化 7、游标 8、副本 9、片键 10、索引的explain属性

1、查询

function ( query , fields , limit , skip, batchSize, options ){
    var cursor = new DBQuery( this._mongo , this._db , this ,
                        this._fullName , this._massageObject( query ) , fields , limit , skip , batchSize , options || this.getQueryOptions() );

    var connObj = this.getMongo();
    var readPrefMode = connObj.getReadPrefMode();
    if (readPrefMode != null) {
        cursor.readPref(readPrefMode, connObj.getReadPrefTagSet());
    }

    return cursor;
}

从上面的函数可以看出find函数接受6个参数,query查询条件,fields指定需要返回的键,limit限制返回结果,skip跳过X个查询结果,batchSize设置返回批次数量,option其他设置。

查询条件可以查询大于($gt),小于($lt),或查询等等。详细用法见官网

Mongo还可以对数组进行查询,用法不难,像查询一个数组里有没有包含一个要查找内容,这时跟普通的查询没有任何区别,这时查找到的内容是数组的子集。如果只要完全符合自己的查询条件的结果,要使用$all。如果要查询的结果包含任意查询条件时,使用$in

很多时候我们知道我们要找的内容在数组的位置时,可以使用像下标的方式查找。像

db.inventory.find( { ‘memos.0.by‘: ‘shipping‘ } )

0表示位于数组的第一位置,后面的".by"是指查询其内嵌文档,这是mongo提供的dot语法。

2、聚合

聚合可以使我们分析数据,它使用了管道的概念,也就是通过一组数组设置一系列顺序执行的任务,每个任务的结果是下一个任务的输入。

借用官网的一张图:

上面的聚合中先匹配了status等于A的文档,然后根据cust_id分组并对各分组的amount加总。

总共提供了筛选管道操作符$match,$limit,$skip,排序管道操作符$sort,分组操作符$group,投射操作符$project和拆分操作符$unwind等。

3、更新 $addToSet

直接使用update是整体覆盖型更新,而我们常常只要更新文档的一部分。一般常用$set修改器,当我们想对一个数组添加内容时可以使用$push,但$push只是单纯添加到数组末尾,如果我们要保证数组内的内容唯一性的话应该使用$addToSet

//syntax
{ $addToSet: { <field1>: <value1>, ... } };

//example
db.test.update(
   { _id: 1 },
   { $addToSet: {letters: [ "c", "d" ] } }
)

4、更新$inc

$inc修改器用来增加已有的键值,或者不存在就创建一个。

在这道题上自己遇到了点问题。我需要对一个数组内给定的位置的文档更新,位置是一个变量,这里假设是变量名是comment_ordinal

你可以像上面提到的Array.0.foo来更新

{$inc: {Array.0.foo: 1}}

但不可以像以下的方法来更新

{$inc: {Array.comment_ordinal.foo: 1};            //直接报错
{$inc: {"Array.comment_ordinal.foo": 1};          //会创建一个Array:[{comment_ordinal.foo: 1},.....]

那时候自己就卡在这里。。。。。现在想想也是思维被框框架架给限制住了。

{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }

看惯了这样的写法后就忘了{ <field1>: <amount1>, <field2>: <amount2>, ... }这东西也是个对象啊!!!

 var selector = {};
 selector[‘comments.‘ + comment_ordinal + ‘.num_likes‘] = 1;
 posts.update({‘permalink‘: permalink}, {$inc: selector},.......)

可以把{Array.0.foo: 1}整个包裹起来嘛~,这样就ok了。

5、索引

索引能提供更高效的查找,当然有些时候相反。

索引基本有3种类型:单键索引、复合索引、多键索引

单键索引:db.friends.createIndex( { "name" : 1 } )

复合索引:db.products.createIndex( { "item": 1, "stock": 1 } )

多键索引:如果索引的某个键在某个文档中是一个数组,那么这就会被mongodb自动为多键索引,不需要你额外的设置。这在查询数组时会很有效率(官网上这么写着,没实践过)

时间: 2024-12-31 09:27:25

MongoDB for node.js developers 七周学习-最终测试小结(1)的相关文章

获得 MongoDB for Node.js Developers 证书

前段时间由于项目需要,开始学习MongoDB,发现MongoDB官网的学习课程非常有帮助. 整个教学很有体系,包括: Video.quiz.Homework.Final Exam. 历时7周,拿到认证证书的一刻还是有些小激动的. 推荐给想学 NoSql(特别是MongoDB)的朋友们,晒一下我的课程内容:

MongoDB Native Node.js Driver

写在前面 最近读<node.js学习指南>,对于mongodb没有介绍太多的工作原理,但是对于一个前端开发者,即使你还没有用过这种数据库也可以让你很好的理解和使用       一本非常好的介绍node.js的书,我一直把他放在触手可及的地方. --Mike Amundsen MongoDB Native Node.js Driver模块是mongodb自带的node的驱动,这个驱动发出的mongodb指令和mongodb客户端发出的指令基本一致. 准备开始- - 1.首先我们应该确保我们的mo

20172328 2018-2019《Java软件结构与数据结构》第七周学习总结

20172328 2018-2019<Java软件结构与数据结构>第七周学习总结 概述 Generalization 本周学习了第11章:二叉查找树.在本章中,主要探讨了二叉查找树的概念和各种二叉查找树实现,考察为二叉查找树添加和删除元素的算法以及维护平衡二叉查找树的算法 教材学习内容总结 A summary of textbook 二叉查找树(binary search tree):二叉树定义的扩展,一种带有附加属性的二叉树.附加属性是什么?树中的每个节点,其左孩子都要小于其父节点,而父节点

20172310 2017-2018《程序设计与数据结构》(下)第七周学习总结

20172310 2017-2018<程序设计与数据结构>(下)第七周学习总结 教材学习内容总结 本章学习的是二叉查找树 11.1 概述 二叉查找树(binay scarch tree)是种带有附加属性的二叉树,即对树中的每个结点,其左孩子都要小于其父结点,而父结点又小于或等于其右孩子. 二叉查找树的定义是上章中讨论的二叉树定义的扩展.因此,下面的操作是二叉树中已定义的那些操作的补充.二叉查找树和平衡二叉查找树的接口是一样的程序列表. 11.2 用链表实现二叉查找树 BinaryTreeNod

20172333 2018-2019-1 《程序设计与数据结构》第七周学习总结

20172333 2018-2019-1 <程序设计与数据结构>第七周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十一章-二叉查找树 一.二叉查找树的概念及相关方法 ①思路:二叉查找树与普通的二叉树的区别类似于有序链表与无序链表的差别,二叉查找树因为实现了Comparable接口的类型的对象,所以该二叉树在添加数据到树中的时候就会自动排序,将大于根节点的数据放在右结点,反之则保存在左结点.这样排序好的二叉树方便查找所以叫二叉查找树. ②方法: public inte

20172301 《程序设计与数据结构》第七周学习总结

20172301 <程序设计与数据结构>第七周学习总结 教材学习内容总结 二叉查找树是一种含有附加属性的二叉树,其左孩子小于父结点,父结点小于或者等于右孩子. 用链表实现二叉查找树 addElement操作:根据给定元素的值,在树中的恰当位置添加该元素. 判断元素是不是Comparable,不是则抛出异常. 树为空:新元素成为根结点. 树非空:新元素与根元素进行比较 小于:如果根的左孩子为空,成为根的左孩子:左孩子不空,遍历添加. 大于:如果根的右孩子为空,成为根的右孩子:右孩子不空,遍历添加

20182310 第七周学习总结

20182310 2019-2020-1 <数据结构与面向对象程序设计>第七周学习总结 教材学习内容总结 1.链表实现栈 data存放数据点 next下一节点 存储地址 数据域 单链表:只含一个指针域的链表 a-> 双向链表:<-a-> 地址不一定连续 要用链表实现栈,就要操作链表的两端.所以除了一个指向链表首元素的引用(称为head)之外,还需要跟踪另一个指向链表末元素的引用(称为tail),还需要一个整型变量count来跟踪队列中的元素数目. 2.尾插法 Student

2014025688 《嵌入式程序设计》第七周学习总结

2014025688(30) <嵌入式程序设计>第七周学习总结 有名管道 FIFO也称为有名管道,它是一种文件类型.FIFO简单理解,就是它能把两个不相关的进程联系起来,FIFO就像一个公共通道,解决了不同进程之间的"代沟".普通的无名管道只能让相关的进程进行沟通(比如父shell和子shell之间).FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾.它们不支持诸如lseek()等文件定

20145301第七周学习总结

20145301第七周学习总结 教材学习内容总结 时间的度量 格林威治时间,简称GMT时间,由观察太阳而得来:世界时,UT:国际原子时,TAI:世界协调时间,UTC:Unix时间,以1970年1月1日00:00:00为起点而经过的秒数,不考虑闰秒修正:epoch,以1970年1月1日00:00:00为起点而经过的毫秒数. 年历简介 儒略历,四年一闰:格里高利历改革了儒略历:ISO 8601标准在数据定义上大部分与格里高利历相同. 认识时区 日光节约时间. Date 使用Date实例的各getTi