MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语 言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。最后由于 MongoDB 可以支持复杂的数据结构,而且带有强大的数据查询功能,因此非常受 到欢迎,很多项目都考虑用 MongoDB 来替代 MySQL 等传统数据库来实现不是特别复杂的 Web 应用。由于数据量实在太大,所以迁移到了 MongoDB 上面,数据查询的速度得到了非 常显著的提升。

下面将介绍一些查询语法
5.1 条件操作符
<, <=, >, >= 这个操作符就不用多解释了 ,最常用也是最简单的

db.collection.find({ "field" : { $gt: value } } ); // 大于: field > value
db.collection.find({ "field" : { $lt: value } } ); // 小于: field < value
db.collection.find({ "field" : { $gte: value } } ); // 大于等于: field >= value
db.collection.find({ "field" : { $lte: value } } ); // 小于等于: field <= value

如果要同时满足多个条件,可以这样做

db.collection.find({ "field" : { $gt: value1, $lt: value2 } } ); // value1 < field < value

5.2 $all 匹配所有
这个操作符跟 SQL 语法的 in 类似,但不同的是, in 只需满足( )内的某一个值即可, 而$all 必
须满足[ ]内的所有值,例如:

db.users.find({age : {$all : [6, 8]}});

可以查询出 {name: 'David', age: 26, age: [ 6, 8, 9 ] }
但查询不出 {name: 'David', age: 26, age: [ 6, 7, 9 ] }
5.3 $exists 判断字段是否存在
查询所有存在 age 字段的记录

db.users.find({age: {$exists: true}});

查询所有不存在 name 字段的记录

db.users.find({name: {$exists: false}});

举例如下:
C1 表的数据如下:

>db.c1.find();
{ "_id" : ObjectId("4fb4a773afa87dc1bed9432d"), "age" : 20, "length" : 30 }
{ "_id" : ObjectId("4fb4a7e1afa87dc1bed9432e"), "age_1" : 20, "length_1" : 30 }

查询存在字段 age 的数据

> db.c1.find({age:{$exists:true}});
{ "_id" : ObjectId("4fb4a773afa87dc1bed9432d"), "age" : 20, "length" : 30 }

可以看出只显示出了有 age 字段的数据, age_1 的数据并没有显示出来
5.4 Null 值处理
Null 值的处理稍微有一点奇怪,具体看下面的样例数据:

> db.c2.find()
{ "_id" : ObjectId("4fc34bb81d8a39f01cc17ef4"), "name" : "Lily", "age" : null }
{ "_id" : ObjectId("4fc34be01d8a39f01cc17ef5"), "name" : "Jacky", "age" : }
{ "_id" : ObjectId("4fc34c1e1d8a39f01cc17ef6"), "name" : "Tom", "addr" : }

其中 ”Lily”的 age 字段为空, Tom 没有 age 字段,我们想找到 age 为空的行,具体如下:

> db.c2.find({age:null})
{ "_id" : ObjectId("4fc34bb81d8a39f01cc17ef4"), "name" : "Lily", "age" : null }
{ "_id" : ObjectId("4fc34c1e1d8a39f01cc17ef6"), "name" : "Tom", "addr" : 23 }

奇怪的是我们以为只能找到”Lily”,但”Tom”也被找出来了 ,所以”null”不仅能找到它自身 ,
连不存在 age 字段的记录也找出来了。那么怎么样才能只找到”Lily”呢?我们用 exists 来限制
一下即可:

> db.c2.find({age:{"$in":[null], "$exists":true}})
{ "_id" : ObjectId("4fc34bb81d8a39f01cc17ef4"), "name" : "Lily", "age" : null }

这样如我们期望一样,只有”Lily”被找出来了。
5.5 $mod 取模运算
查询 age 取模 10 等于 0 的数据

db.student.find( { age: { $mod : [  ,  ] } } )

举例如下:
C1 表的数据如下:

> db.c1.find()
{ "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" : , "length_1" : }
{ "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : , "length_1" : }
{ "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : , "length_1" : }

查询 age 取模 6 等于 1 的数据

> db.c1.find({age: {$mod : [ 6 , 1 ] } })
{ "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" : 30 }

可以看出只显示出了 age 取模 6 等于 1 的数据,其它不符合规则的数据并没有显示出来

5.6 $ne 不等于
查询 x 的值不等于 3 的数据

db.things.find( { x : { $ne : 3 } } );

举例如下:
C1 表的数据如下:

> db.c1.find()
{ "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" : 30 }
{ "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8, "length_1" : 30 }
{ "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6, "length_1" : 30 }

查询 age 的值不等于 7 的数据

> db.c1.find( { age : { $ne : 7 } } );
{ "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8, "length_1" : 30 }
{ "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6, "length_1" : 30 }

可以看出只显示出了 age 等于 7 的数据,其它不符合规则的数据并没有显示出来
5.7 $in 包含
与 sql 标准语法的用途是一样的,即要查询的是一系列枚举值的范围内
查询 x 的值在 2,4,6 范围内的数据
db.things.find({x:{$in: [2,4,6]}});
举例如下:
C1 表的数据如下:

> db.c1.find()
{ "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" : 30 }
{ "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8, "length_1" : 30 }
{ "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6, "length_1" : 30 }

查询 age 的值在 7,8 范围内的数据

> db.c1.find({age:{$in: [,]}});
{ "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" : , "length_1" : }
{ "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : , "length_1" : }

可以看出只显示出了 age 等于 7 或 8 的数据,其它不符合规则的数据并没有显示出来
5.8 $nin 不包含
与 sql 标准语法的用途是一样的,即要查询的数据在一系列枚举值的范围外
查询 x 的值在 2,4,6 范围外的数据

db.things.find({x:{$nin: [2,4,6]}});

举例如下:
C1 表的数据如下:

> db.c1.find()
{ "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" : 30 }
{ "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8, "length_1" : 30 }
{ "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6, "length_1" : 30 }

查询 age 的值在 7,8 范围外的数据

> db.c1.find({age:{$nin: [7,8]}});
{ "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6, "length_1" : 30 }

可以看出只显示出了 age 不等于 7 或 8 的数据,其它不符合规则的数据并没有显示出来
5.9 $size 数组元素个数
对于{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }记录
匹配 db.users.find({favorite_number: {$size: 3}});
不匹配 db.users.find({favorite_number: {$size: 2}});
举例如下:
C1 表的数据如下:

> db.c1.find()
{ "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" : 30 }
{ "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8, "length_1" : 30 }
{ "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6, "length_1" : 30 }

查询 age 的值在 7,8 范围外的数据

> db.c1.find({age:{$nin: [7,8]}});
{ "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6, "length_1" : 30 }

可以看出只显示出了 age 不等于 7 或 8 的数据,其它不符合规则的数据并没有显示出来
5.10 正则表达式匹配
查询不匹配 name=B*带头的记录
db.users.find({name: {$not: /^B.*/}});
举例如下:
C1 表的数据如下:

> db.c1.find();
{ "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 }
{ "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }

查询 name 不以 T 开头的数据

> db.c1.find({name: {$not: /^T.*/}});
{ "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }

可以看出只显示出了 name=Tony 的数据,其它不符合规则的数据并没有显示出来
5.11 Javascript 查询和$where 查询
查询 a 大于 3 的数据,下面的查询方法殊途同归

 db.c1.find( { a : { $gt:  } } );
db.c1.find( { $where: "this.a > 3" } );
db.c1.find("this.a > 3");
f = function() { return this.a > ; } db.c1.find(f);

5.12 count 查询记录条数
count 查询记录条数
db.users.find().count();
以下返回的不是 5,而是 user 表中所有的记录数量

db.users.find().skip(10).limit(5).count();

如果要返回限制之后的记录数量,要使用 count(true)或者 count(非 0)
db.users.find().skip(10).limit(5).count(true);
举例如下:
C1 表的数据如下:

> db.c1.find()
{ "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 }
{ "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }

查询 c1 表的数据量

> db.c1.count()
2

可以看出表中共有 2 条数据
5.13 skip 限制返回记录的起点
从第 3 条记录开始,返回 5 条记录(limit 3, 5)
db.users.find().skip(3).limit(5);
举例如下:
C1 表的数据如下:

> db.c1.find()
{ "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : }
{ "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : }

查询 c1 表的第 2 条数据

> db.c1.find().skip().limit()
{ "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : }

可以看出表中第 2 条数据被显示了出来
5.14 sort 排序
以年龄升序 asc

db.users.find().sort({age: 1});

以年龄降序 desc

db.users.find().sort({age: -1});

C1 表的数据如下:

> db.c1.find()
{ "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : }
{ "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : }

查询 c1 表按 age 升序排列

> db.c1.find().sort({age: 1});
{ "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }
{ "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 }

第 1 条是 age=10 的,而后升序排列结果集
查询 c1 表按 age 降序排列

> db.c1.find().sort({age: -1});
{ "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 }
{ "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }

第 1 条是 age=20 的,而后降序排列结果集
5.2 游标
象大多数数据库产品一样, MongoDB 也是用游标来循环处理每一条结果数据,具体语法如
下:

> for( var c = db.t3.find(); c.hasNext(); ) {
... printjson( c.next());
... }
{ "_id" : ObjectId("4fb8e4838b2cb86417c9423a"), "age" : }
{ "_id" : ObjectId("4fb8e4878b2cb86417c9423b"), "age" : }
{ "_id" : ObjectId("4fb8e4898b2cb86417c9423c"), "age" : }
{ "_id" : ObjectId("4fb8e48c8b2cb86417c9423d"), "age" : }
{ "_id" : ObjectId("4fb8e48e8b2cb86417c9423e"), "age" : }

MongoDB 还有另一种方式来处理游标

> db.t3.find().forEach( function(u) { printjson(u); } );
{ "_id" : ObjectId("4fb8e4838b2cb86417c9423a"), "age" : 1 }
{ "_id" : ObjectId("4fb8e4878b2cb86417c9423b"), "age" : 2 }
{ "_id" : ObjectId("4fb8e4898b2cb86417c9423c"), "age" : 3 }
{ "_id" : ObjectId("4fb8e48c8b2cb86417c9423d"), "age" : 4 }
{ "_id" : ObjectId("4fb8e48e8b2cb86417c9423e"), "age" : 5 }
>

5.3 存储过程
MongoDB 为很多问题提供了一系列的解决方案,针对于其它数据库的特性,它仍然毫不示
弱,表现的非比寻常。
MongoDB 同样支持存储过程。关于存储过程你需要知道的第一件事就是它是用 javascript 来
写的。也许这会让你很奇怪,为什么它用 javascript 来写,但实际上它会让你非常满意,
MongoDB 存储过程是存储在 db.system.js 表中的,我们想象一个简单的 sql 自定义函数如下:
function addNumbers( x , y ) {
return x + y;
}
下面我们将这个 sql 自定义函数转换为 MongoDB 的存储过程:
> db.system.js.save({_id:"addNumbers", value:function(x, y){ return x + y; }});
存储过程可以被查看,修改和删除,所以我们用 find 来查看一下是否这个存储过程已经被
创建上了 。

> db.system.js.find()
{ "_id" : "addNumbers", "value" : function cf__1__f_(x, y) {
return x + y;
} }
>

这样看起来还不错,下面我看来实际调用一下这个存储过程:

> db.eval('addNumbers(3, 4.2)');
7.2
>

这样的操作方法简直太简单了 ,也许这就是 MongoDB 的魅力所在。
db.eval()是一个比较奇怪的东西,我们可以将存储过程的逻辑直接在里面并同时调用,而无
需事先声明存储过程的逻辑。

>db.eval( function() { return 3+3; } );
6
>

从上面可以看出, MongoDB 的存储过程可以方便的完成算术运算,但其它数据库产品在存
储过程中可以处理数据库内部的一些事情,例如取出某张表的数据量等等操作,这些
MongoDB 能做到吗?答案是肯定的, MongoDB 可以轻而易举的做到,看下面的实例吧:

> db.system.js.save({_id:"get_count", value:function(){ return db.c1.count(); }});
> db.eval('get_count()')
2

 

NoSql---MongoDB基本操作的更多相关文章

  1. 【MongoDB详细使用教程】二、MongoDB基本操作

    目录 数据类型 数据库操作 集合操作 数据操作 增 查 改 修改整行 修改指定字段的值 删 数据类型 MongoDB常见类型 说明 Object ID 文档ID String 字符串,最常用,必须是有 ...

  2. MongoDB 基本操作和聚合操作

    一 . MongoDB 基本操作 基本操作可以简单分为查询.插入.更新.删除. 1 文档查询 作用 MySQL SQL  MongoDB  所有记录  SELECT * FROM users;  db ...

  3. NOSQL -- Mongodb的简单操作与使用(win10)

    NOSQL -- Mongodb的简单操作与使用(wins) MongoDB 创建集合: db.createCollection(name, options) use huhu db.createCo ...

  4. NOSQL -- Mongodb的简单操作与使用(wins)

    NOSQL -- Mongodb的简单操作与使用(wins) 启动mongodb: 1.首先启动服务 dos命令下:net start Mongndb 也可以查询服务,手动开启服务: 完成后: 2.启 ...

  5. NOSQL -- mongoDB的了解与安装(Wins10)

    NOSQL -- mongoDB的了解与安装 首先看看什么是nosql: 我的理解:非关系型数据库,大多是以map形式存储,map<key,value>,适合存储,查询.redis也是no ...

  6. MongoDB【第三篇】MongoDB基本操作

    MongoDB的基本操作包括文档的创建.删除.和更新 文档插入 1.插入 #查看当前都有哪些数据库 > show dbs; local 0.000GB tim 0.000GB #使用 tim数据 ...

  7. mongodb基本操作的学习

    1.基本操作: 如何安装?创建存放数据的文件夹 robomongo: 图形化管理工具 create -->save -->connect 创建数据库:use Database_name 检 ...

  8. 30分钟让你了解MongoDB基本操作

    今天记录下MongoDB的基本操作,这只是最基本的,所以是应该掌握的. 数据库 数据库是一个物理容器集合.每个数据库都有自己的一套文件系统上的文件.一个单一的MongoDB服务器通常有多个数据库. 集 ...

  9. mongodb基本操作及存储图片显示方案

    先介绍下mongodb的基本操作及使用 第一部:开启安全性验证 如果需要给MongoDB数据库使用安全验证,则需要用--auth开启安全性检查,则只有数据库认证的用户才能执行读写操作,开户安全性检查, ...

  10. 30分钟让你了解MongoDB基本操作(转)

    今天记录下MongoDB的基本操作,这只是最基本的,所以是应该掌握的. 数据库 数据库是一个物理容器集合.每个数据库都有自己的一套文件系统上的文件.一个单一的MongoDB服务器通常有多个数据库. 集 ...

随机推荐

  1. inline-block使标签间出现空白

    HTML Markup <ul> <li>item1</li> <li>item2</li> <li>item3</li& ...

  2. 记录js的一些小技巧

    1.取数组最大值,最小值 Math.max.apply(null,[1,2,3,32,3]); Math.min.apply(null,[1,2,3,32,3]); 2.旧版IE setTimeout ...

  3. paip. 混合编程的实现resin4 (自带Quercus ) 配置 php 环境

    paip. 混合编程的实现resin4 (自带Quercus ) 配置 php 环境 #---混合编程的类型 1.代码inline 方式 2.使用库/api  解析方式. #----配置resin 支 ...

  4. JavaScript的for循环编写九九乘法表

    for(var i = 1; i <= 10; i++) { for(var j = 1; j <= i; j++) { document.writeln(i + '*' + j + '= ...

  5. MFC如何使用静态MFC库

    大部分MFC程序都是使用 在共享DLL中使用MFC ,但是VS每一个版本都需要一个 MFC运行库,实在是有点烦人. 所以我选择了使用静态MFC库,虽然文件会大一些,但是至少不麻烦了. VS这个做的不够 ...

  6. 由1433端口入侵,浅谈sqlserver安全 (转)

    前几日笔者在家里的PC上安装了Windows7旗舰版的操作系统,顺便搭了sqlserver2008和vs2010的开发环境,本打算业余时 间可以方便开发.学习.可是不尽人意啊!用了不到两天,居然突然出 ...

  7. //暴力打开某个APP iOS 私有API LSApplicationWorkspace

    //暴力打开某个APP = .= 如果可以打开.直接打开不解释 +(BOOL)isOpenApp:(NSString*)appIdentifierName { Class LSApplicationW ...

  8. php内存缓存

    1.文件方式缓存 哈希子目录缓存 2.APC APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”.它为我们提供了缓存和优化PHP的中间代码的框架. APC的缓存分两 ...

  9. 源代码安装 MySQL 5.6.28

    本文内容 创建 MySQL 用户和组 解压 MySQL 源代码包 生成配置安装文件 编译和安装 MySQL 配置文件 创建 MySQL 授权表 MySQL 目录授权 启动 MySQL 验证 MySQL ...

  10. 修改oracle密码有效期限制

    racle11g,静默安装后用户的密码有效期默认设置为180天,180天后密码将失效,oracle会提示要修改密码.   我们项目用的是jdbc连接oracle数据库,没法自动处理oracle的这种密 ...