`
jamie.wang
  • 浏览: 340576 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

MongoDB学习——高级查询

阅读更多

 丰富的查询

MongoDB支持类似于SQL的>,>=,<,<=,<>,分别用 "$gt", "$gte", "$lt", "$lte", "$ne"表示,以及:$in,$nin,也支持条件的组合:and, or。

甚至还支持正则表达式,你没看错,正则表达式,强大吧。

> db.user.find()
{ "_id" : ObjectId("51f730c604f4bacbc87f67f2"), "name" : "jack", "age" : 53, "address" : { "country" : "CN", "city" : "Macao" }, "fav" : [ "apple", "banana" ], "email" : "yeah@yahoo.com" }
{ "_id" : ObjectId("51f7312b04f4bacbc87f67f3"), "name" : "allen", "age" : 20, "address" : { "country" : "US", "city" : "NewYork" }, "email" : "allen@hotmail.com" }
>
> db.user.find({"age":{$lt:30}})
{ "_id" : ObjectId("51f7312b04f4bacbc87f67f3"), "name" : "allen", "age" : 20, "address" : { "country" : "US", "city" : "NewYork" }, "email" : "allen@hotmail.com" }
>
> db.user.find({"address.country":{$in:["CN","US"]},"age":{$gte:30}})
{ "_id" : ObjectId("51f730c604f4bacbc87f67f2"), "name" : "jack", "age" : 53, "address" : { "country" : "CN", "city" : "Macao" }, "fav" : [ "apple", "banana" ], "email" : "yeah@yahoo.com" }
>
> db.user.find({"email":/.+@yahoo.com/})
{ "_id" : ObjectId("51f730c604f4bacbc87f67f2"), "name" : "jack", "age" : 53, "address" : { "country" : "CN", "city" : "Macao" }, "fav" : [ "apple", "banana" ], "email" : "yeah@yahoo.com" }
>

另外MongoDB也提供了where子句,可以定义一个javascipt的predict函数来查询

> db.user.find({$where:function() {return this.address.city == 'Macao'}})
{ "_id" : ObjectId("51f730c604f4bacbc87f67f2"), "name" : "jack", "age" : 53, "address" : { "country" : "CN", "city" : "Macao" }, "fav" : [ "apple", "banana" ], "email" : "yeah@yahoo.com" }
>

 聚集函数

MongoDB也支持常用的聚集函数:count,distinct,group等

其中group较为复杂,需要指定初始值,和$reduce函数,

 另外group还可以加condition指定过滤条件,finalize指定每组文档$reduce完成后的动作

> db.user.find()
{ "_id" : ObjectId("51f7560004f4bacbc87f67f4"), "name" : "brodie", "age" : 30, "gender" : "male", "address" : { "country" : "CN", "city" : "ShangHai" } }
{ "_id" : ObjectId("51f7562304f4bacbc87f67f5"), "name" : "dany", "age" : 28, "gender" : "male", "address" : { "country" : "CN", "city" : "ShangHai" } }
{ "_id" : ObjectId("51f7563d04f4bacbc87f67f6"), "name" : "davis", "age" : 31, "gender" : "male", "address" : { "country" : "CN", "city" : "WuHan" } }
{ "_id" : ObjectId("51f7566904f4bacbc87f67f7"), "name" : "jameson", "age" : 37, "gender" : "female", "address" : { "country" : "US", "city" : "NewYork" } }
>
> db.user.count({"age":{$gte:30}})
3
> db.user.distinct("address.country")
[ "CN", "US" ]
>
> db.user.group({
...     "key":{"address.country":true},
...     "initial":{"users":[]},
...     "condition":{"age":{$gte:30}},
...     "reduce":function(curdoc, predoc) {
...         predoc.users.push(curdoc.name);
...     },
...     "finalize":function(predoc) {
...         predoc.count = predoc.users.length;
...     }
... })
[
    {
        "address.country" : "CN",
        "users" : [
            "brodie",
            "davis"
        ],
        "count" : 2
    },
    {
        "address.country" : "US",
        "users" : [
            "jameson"
        ],
        "count" : 1
    }
]

 MapReduce

MapReduce是比较复杂的聚集函数,但更加灵活。

map函数:指定的分组函数,其中调用emit分组,第一个参数为分组的键,value为reduce时需要的字段;

reduce函数:分组后的处理函数,参数key为分组的key,values为分组后的集合;

mapReduce的第三个参数指定输出的结合名称;

运行mapReduce后会输出执行的状态信息

下面用mapReduce作出上面group同样的效果

 

> var map = function() {
...    emit(this.address.country, {user:this.name,age:this.age,count:1});
... }
> 
> var reduce = function(key, values) {
...     var result = {users:[],count:0};
...     for (var i = 0; i < values.length; ++i) {
...         if (values[i].age >= 30) {
...             result.users.push(values[i].user);
...             result.count += values[i].count;
...         }
...     }
...     return result;
... }
> 
> db.user.mapReduce(map,reduce, {"out":"user_by_country"})
{
	"result" : "user_by_country",
	"timeMillis" : 62, // time used
	"counts" : {
		"input" : 4, // number of input document
		"emit" : 4, // times of emit called
		"reduce" : 1, // times reduce called,note:a key
that has only a single value, will not trigger the reduce
		"output" : 2
	},
	"ok" : 1,
}
> db.user_by_country.find()
{ "_id" : "CN", "value" : { "users" : [  "brodie",  "davis" ], "count" : 2 } }
{ "_id" : "US", "value" : { "user" : "jameson", "age" : 37, "count" : 1 } }
> 
 

 

分享到:
评论

相关推荐

    30分钟学MongoDB系列——高级查询与操作篇

    1.分篇章进行学习,内容控制30分钟内 2.1个月疗程,不要放弃治疗哦 3.图文并茂,有问题请发到邮箱

    30分钟学MongoDB系列 ——MongoDB的安全机制和高级管理篇

    1.分篇章进行学习,内容控制30分钟内 2.1个月疗程,不要放弃治疗哦 3.图文并茂,有问题请发到邮箱

    Java全能学习面试手册——Java面试题库.zip

    Java全能学习面试手册——Java面试题库.zip 01 7道消息队列ActiveMQ面试题!.pdf 02 10道Java高级必备的Netty面试题!.pdf 03 10道Java面试必备的设计模式面试题!.pdf 04 10个Java经典的List面试题!.pdf 05 10个...

    数据结构算法

    索引操作 8天学通MongoDB——第三天 细说高级操作 8天学通MongoDB——第二天 细说增删查改 8天学通MongoDB——第一天 基础入门 UML系列(4)团队沟通利器之UML——类图 团队沟通利器之UML—— 序列图 团队沟通利器之...

    NoSQL数据库技术实战

    Amazon的高可用键值对存储、LevelDb——出自Google的Key-Value数据库、Redis实战、面向文档的数据库CouchDB、MongoDB实战、MySQL基础、MySQL高级特性与性能优化。 本书涉及面广,从基本操作到高级技术和核心原理,再...

    R的极客理想:工具篇,完整扫描版

    《R的极客理想·工具篇》首先介绍了R的工具包、时间序列包和性能监控包,然后阐述R语言与其他编程语言的通信..., 本书姊妹篇《R的极客理想——高级开发篇》将深入介绍R语言底层原理,并使用R语言开发出企业级的应用。

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    estudosJS:JavaScript 学习指南

    它是一种高级编程语言(近似于人类语言——英语)。 它被认为是一种解释性/功能性语言。 JavaScript 允许您在HTML元素中插入动态或交互,并以编程方式控制网页、系统或应用程序中的 CSS 自定义。 该语言存在于...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

Global site tag (gtag.js) - Google Analytics