惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
V
V2EX
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
小众软件
小众软件
Vercel News
Vercel News
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
J
Java Code Geeks
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog
B
Blog
美团技术团队
量子位

博客园 - K!ngZ

常用正则 MongoDB学习笔记(9)--优化器 profile MongoDB学习笔记(8)--索引及优化索引 MongoDB学习笔记(7)--访问控制 MongoDB学习笔记(6)--数据备份数据恢复 MongoDB学习笔记(5)--数据导入导出mongoexport MongoDB学习笔记(4)--Capped Collection MongoDB学习笔记(2)--增删改查 MongoDB学习笔记(1)--了解MongoDB 远程文件抓取类 [转]BizTalk开发系列(三十四) Xpath SQL Server 2005 命令行实用工具 [转]雅虎公司C#笔试题 [转] OLE DB 访问接口 "SQLNCLI" 返回了消息 "未指定的错误"。 Asp.net中的日期处理函数 [转]正则表达式实现资料验证的技术总结 ajax乱码问题解决 [转]ASP.Net缓存总结 [转]预防按钮的多次点击【恶意刷新】
MongoDB学习笔记(3)--高级查询
K!ngZ · 2011-09-13 · via 博客园 - K!ngZ

面向文档的 NoSQL 数据库主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能。 

条件操作符 

<, <=, >, >=  这个操作符就不用多解释了,最常用也是最简单的 

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

$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 ] } 

$exists 判断字段是否存在

查询所有存在age字段的记录  

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

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

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

Null 值处理 

> db.c2.find({age:null})   

$mod 取模运算 

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

db.c1.find({age: {$mod : [ 6 , 1 ] } })

$ne 不等于

查询x的值不等于3 的数据 

db.c1.find( { age : { $ne : 7 } } ); 

$in 包含 

db.c1.find({age:{$in: [7,8]}}); 

$nin 不包含

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

db.c1.find({age:{$nin: [7,8]}});

$size 数组元素个数

对于{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }记录 

匹配db.users.find({favorite_number: {$size: 3}}); 

不匹配db.users.find({favorite_number: {$size: 2}}); 

正则表达式匹配

查询name 不以T开头的数据

db.c1.find({name: {$not: /^T.*/}});  

Javascript 查询和$Where查询

查询a大于3的数据,下面的查询方法殊途同归 

  db.c1.find( { a : { $gt: 3 } } ); 

  db.c1.find( { $where: "this.a > 3" } ); 

  db.c1.find("this.a > 3"); 

  f = function() { return this.a > 3; } db.c1.find(f);  

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);  

skip限制返回记录的起点

从第3 条记录开始,返回5 条记录(limit 3, 5) 

db.users.find().skip(3).limit(5); 

sort 排序 

以年龄升序asc 

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

以年龄降序desc 

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

游标

for( var c = db.t3.find(); c.hasNext(); ) { 

printjson( c.next()); 

}

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

> db.t3.find().forEach( function(u) { printjson(u); } ); 

存储过程 

关于存储过程你需要知道的第一件事就是它是用 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.eval('addNumbers(3, 4.2)'); 

db.eval()是一个比较奇怪的东西,我们可以将存储过程的逻辑直接在里面并同时调用,而无需事先声明存储过程的逻辑。  

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