第一部分 基础篇 第四章 MongoDB查询

声明:该文章主要来自《MongoDB实战》一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用。

1、查询记录

1.1、普通查询

在没有深入查询之前,我们先看看怎么从一个查询中返回一个游标对象,可以简单的通过find()来查询,它返回一个任意结构的集合,如果实现特定的查询在稍后讲解。

实现上面同样的查询,然后通过while来输出:

> var cursor = db.xuz.find();

> while(cursor.hasNext()) printjson(cursor.next());

{ "_id" : ObjectId("54a8a4ff2db3e1b27d0e5203"), "name" : "mongo" }

{ "_id" : ObjectId("54a8a5042db3e1b27d0e5204"), "x" : 4 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2466"), "x" : 5, "j" : 1 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2467"), "x" : 5, "j" : 2 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2468"), "x" : 5, "j" : 3 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2469"), "x" : 5, "j" : 4 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246a"), "x" : 5, "j" : 5 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246b"), "x" : 5, "j" : 6 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246c"), "x" : 5, "j" : 7 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246d"), "x" : 5, "j" : 8 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246e"), "x" : 5, "j" : 9 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246f"), "x" : 5, "j" : 10 }

>

上面的例子显示了游标风格的迭代输出,.hasNext()函数告诉我们是否还有数据,如果有则可以调用next()函数。

当我们使用的是JavaScript shell,可以用到JS的特性,forEach就可以输出游标了,下面的例子就是使用forEach()来循环输出:forEach()必须定义一个函数供每个游标元素调用。

> db.xuz.find().forEach(printjson)

{ "_id" : ObjectId("54a8a4ff2db3e1b27d0e5203"), "name" : "mongo" }

{ "_id" : ObjectId("54a8a5042db3e1b27d0e5204"), "x" : 4 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2466"), "x" : 5, "j" : 1 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2467"), "x" : 5, "j" : 2 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2468"), "x" : 5, "j" : 3 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2469"), "x" : 5, "j" : 4 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246a"), "x" : 5, "j" : 5 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246b"), "x" : 5, "j" : 6 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246c"), "x" : 5, "j" : 7 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246d"), "x" : 5, "j" : 8 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246e"), "x" : 5, "j" : 9 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246f"), "x" : 5, "j" : 10 }

在MongoDB shell里,我们也可以把游标当做数组来使用:

> var cursor = db.xuz.find();

> printjson(cursor[4]);

{ "_id" : ObjectId("54a8a5a427681683ca2c2468"), "x" : 5, "j" : 3 }

使用游标时候请注意占用内存的问题,特别是很大的游标对象,有可能会内存溢出,所以以你更改用迭代的方式来输出,下面的实例则是把游标转换成真实的数组类型:

> var arr = db.xuz.find().toArray();

> arr[4];

{ "_id" : ObjectId("54a8a5a427681683ca2c2468"), "x" : 5, "j" : 3 }

请注意这些特性只是在Mongo Shell里使用,而不是所有的其他应用程序驱动都支持,MongoDB游标对象不是没有快照,如果有其他用户在集合里第一次或者最后一次调用next(),你可能得不到游标里的数据,所以要明确的锁定你要查询的游标。

1.2、条件查询

到这里我们已经知道怎么从游标里实现一个查询并返回数据对象,下面就来看看怎么根据指定的条件来查询。

下面的实例就是说明如何执行一个类似SQL的查询,并演示了怎么在MongoDB里实现,这是在MongoDB shell里查询,当然你也可以用其他的应用程序驱动或者语言来实现:

SQL:select * from xuz where name="mongo";

MongoDB:

> db.xuz.find({name:"mongo"}).forEach(printjson);

{ "_id" : ObjectId("54a8a4ff2db3e1b27d0e5203"), "name" : "mongo" }

SQL:select * from xuz where x=4

MongoDB:

> db.xuz.find({x:4}).forEach(printjson);

{ "_id" : ObjectId("54a8a5042db3e1b27d0e5204"), "x" : 4 }

查询条件是{a:A,b:B,....}类似于where a==A and b==B and ....

上面显示的是所有的元素,当然我们也可以返回特定的元素,类似于返回表里某个字段的值,只需要在find({x:4})里指定元素的名字。

SQL:select j from xuz where x=4

MongoDB:

> db.xuz.find({x:5},{j:true}).forEach(printjson);

{ "_id" : ObjectId("54a8a5a427681683ca2c2466"), "j" : 1 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2467"), "j" : 2 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2468"), "j" : 3 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2469"), "j" : 4 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246a"), "j" : 5 }

1.3、findOne()语法

为了方便考虑,MongoDB shell避免游标可能带来的开销,提供一个findOne()函数,这个函数和find()函数一样,不过它返回的是游标里第一条数据,或者返回null,即空数据。

作为一个例子,name="mongo"可以用很多方法来实现,可以用next()来循环游标或者当做数组返回第一个元素。

但是用findOne()方法则更简单和高效:

> printjson(db.xuz.findOne({name:"mongo"}))

{ "_id" : ObjectId("54a8a4ff2db3e1b27d0e5203"), "name" : "mongo" }

1.4、通过limit限制结果集数量

如果需要限制结果集的长度,那么可以调用limit方法

这是强烈推荐解决性能问题的额方法,就是通过限制条数来减少网络传输,比如:

> db.xuz.find().limit(3)

{ "_id" : ObjectId("54a8a4ff2db3e1b27d0e5203"), "name" : "mongo" }

{ "_id" : ObjectId("54a8a5042db3e1b27d0e5204"), "x" : 4 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2466"), "x" : 5, "j" : 1 }

> db.xuz.find().count();

63

通过上面可以知道,xuz集合中总共有63条数据,然后设定limit的值之后只查询出3条数据,limit也是分页查询常用到。

2、修改记录

将name是mongo的记录的name修改为mongo_new。

> db.xuz.update({name:"mongo"},{$set:{name:"mongo_new"}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.xuz.find();

{ "_id" : ObjectId("54a8a4ff2db3e1b27d0e5203"), "name" : "mongo_new" }

3、删除记录

将用户name是mongo_new的记录从集合xuz中删除。

> db.xuz.remove({name:"mongo_new"});

WriteResult({ "nRemoved" : 1 })

> db.xuz.find();

{ "_id" : ObjectId("54a8a5042db3e1b27d0e5204"), "x" : 4 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2466"), "x" : 5, "j" : 1 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2467"), "x" : 5, "j" : 2 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2468"), "x" : 5, "j" : 3 }

{ "_id" : ObjectId("54a8a5a427681683ca2c2469"), "x" : 5, "j" : 4 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246a"), "x" : 5, "j" : 5 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246b"), "x" : 5, "j" : 6 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246c"), "x" : 5, "j" : 7 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246d"), "x" : 5, "j" : 8 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246e"), "x" : 5, "j" : 9 }

{ "_id" : ObjectId("54a8a5a427681683ca2c246f"), "x" : 5, "j" : 10 }

经验证却是没有name为mongo_new的记录了。

4、常用工具集

MongoDB在bin目录下提供了一系列有用的工具,这些工具提供了MongoDB在运维管理上的方便。

  • bsondump:将bson格式的文件转存为json格式的数据。
  • mongo:客户端命令行工具,其实也是一个JS解释器,支持JS语法
  • mongod:数据库服务端,每个实例启动一个进程,可以fork为后台运行。
  • mongodump/mongorestore:数据备份和恢复工具。
  • mongoexport/mongoimport:数据导出和导入工具。
  • mongofile:GridFS管理工具,可实现二进制文件的存取。
  • mongos:分片路由,如果使用了sharding功能,则应用程序连接的是mongos而不是mongod。
  • mongostat:实时性能监控工具。
  • mongotop:提供每个集合的水平的统计数据。

以上所有工具在以后的章节中会详细的介绍到。

时间: 2024-07-30 13:37:43

第一部分 基础篇 第四章 MongoDB查询的相关文章

第一部分 基础篇 第四章 MongoDB快速入门

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. MongoDB shell是MongoDB自带的交互式JavaScript shell,用来对MongoDB进行操作和管理的交互式环境. 使用./mongo --help可以查看相关连接参数,下面将从常见的操作,如插入.查询.修改.删除等几个方面阐述MongoDB shel

第一部分 基础篇 第三章 MongoDB体系结构

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. MongoDB是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台性,在不同的操作系统上虽然略有差别,但是从整体架构上来看,MongoDB在不同的平台上是一样的,如数据逻辑结构和数据存储等等. 一个运行着的MongoDB数据库就可以看成是一个MongoDB

Java语言程序设计(基础篇) 第四章 数学函数、字符和字符串

第四章 数学函数.字符和字符串 4.2 常用数学函数 方法分三类:三角函数方法(trigonometric method).指数函数方法(exponent method)和服务方法(service method) 4.4 String类型 String类型不是基本类型,而是引用类型(reference type).

MFC:基础篇 第四章 MFC动态绑定机制

一.简介 二.动态绑定 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 原文地址:https://www.cnblogs.com/k5bg/p/11227201.html

第五部分 架构篇 第十四章 MongoDB Replica Sets 架构(自动故障转移/读写分离实践)

说明:该篇内容部分来自红丸编写的MongoDB实战文章. 1.简介 MongoDB支持在多个机器中通过异步复制达到故障转移和实现冗余,多机器中同一时刻只有一台是用于写操作,正是由于这个情况,为了MongoDB提供了数据一致性的保障,担当primary角色的服务能把读操作分发给Slave(详情请看前两篇关于Replica Set成员组成和理解). MongoDB高可用分为两种: Master-Slave主从复制:只需要在某一个服务启动时加上-master参数,而另外一个服务加上-slave与-so

第四部分 性能篇 第十一章 MongoDB 性能监控

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. 1.MongoStat 此工具可以快速的查看某组运行中的MongoDB实例的统计信息,用法如下: [[email protected] bin]# ./mongostat connected to: 127.0.0.1 insert query update delete g

第二部分 应用篇 第七章 MongoDB MapReduce

1.简介 MongoDB的MapReduce相当于MySQL中的group by,所以在MongoDB上使用Map/Reduce进行统计很容易,使用MapReduce要实现两个函数Map函数和Reduce函数,Map函数调用emit(key,value),遍历collection中所有的记录,将key与value传递给Reduce函数进行处理,Map函数和Reduce函数可以使用JavaScript来实现,可以通过db.runCommand或者mapReduce命令来执行一个MapReduce的

Python第一周基础篇

<感言:首先感谢alex老师精彩课程,第一周的第一天,随着金角大王的豪言壮语般的心灵鸡汤完美收场.此刻坐在电脑前的我仍是热血澎湃,下定决心好好跟着大王一起学好python> ----祝老师教师节快乐                                      Python第一周基础篇 博文结构: --1--python2.*与python3.*主要区别 --2--python安装与配置 --3--PyCharm开发工具的安装与配置 --4--变量的定义 --5--注释的使用 --

小猪猪逆袭成博士之C++基础篇(四)数组、指针、vector、迭代器

小猪猪逆袭成博士之C++基础篇(四) 关键词:数组,Vector. 一.数组与指针 数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据.例如:int a[10],意思就是从a开始有10个连续的int大小的空间.我们还是从初始化说起. 我们以数据类型int为例,当然也可由有很多的数据类型,可以是像int,double这种,也可以是自定义的类,一般的初始化方法有: int a[10]; int a[10]={0}; int a[3]={0,1,2}; 在前面的文章中,有