丰富的查询
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" }
>
{ "_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" }
>
{ "_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
}
]
{ "_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 } } >
相关推荐
1.分篇章进行学习,内容控制30分钟内 2.1个月疗程,不要放弃治疗哦 3.图文并茂,有问题请发到邮箱
1.分篇章进行学习,内容控制30分钟内 2.1个月疗程,不要放弃治疗哦 3.图文并茂,有问题请发到邮箱
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—— 序列图 团队沟通利器之...
Amazon的高可用键值对存储、LevelDb——出自Google的Key-Value数据库、Redis实战、面向文档的数据库CouchDB、MongoDB实战、MySQL基础、MySQL高级特性与性能优化。 本书涉及面广,从基本操作到高级技术和核心原理,再...
《R的极客理想·工具篇》首先介绍了R的工具包、时间序列包和性能监控包,然后阐述R语言与其他编程语言的通信..., 本书姊妹篇《R的极客理想——高级开发篇》将深入介绍R语言底层原理,并使用R语言开发出企业级的应用。
《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...
它是一种高级编程语言(近似于人类语言——英语)。 它被认为是一种解释性/功能性语言。 JavaScript 允许您在HTML元素中插入动态或交互,并以编程方式控制网页、系统或应用程序中的 CSS 自定义。 该语言存在于...
《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...
《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...