对于MongoDB来讲视图工具备MongoDB VUE等,我的不是很习惯使用视图工具,因此比较喜欢使用MongoDB自带的javascript shell。不是你们所谓的提高B格,只是我的习惯。一下的一些内容参考自《MongoDB 权威指南2》.javascript
在个人bin下面有一个js脚本我执行一下命令即可以完成调用。java
mongo script1.js
mongo --quiet script1.js [不打印MongDB shell Version ...]
load("script1.js") 登陆后执行
本篇博客主要包括如下内容:
一、使用find或者findOne 函数和查询文档数据库执行查询。
二、使用$条件查询实现分为查询数据集包含查询、不等式查询,以及其余查询
三、查询返回一个数据库游标,游标只会在你须要时才会将须要的文档批量返回。
四、针对游标的元数据操做,包括忽略必定数量的结果,或者限定返回结果的数量,或者限定返回结果的数量,以对结果集的排序正则表达式
MongoDB 中使用find查询就是返回一个集合中的子文档,范围从0个文档到整个集合。find的第一个参数决定了要返回那些文档,这个参数是一个文档。用于指定查询条件。sql
一、基本查询 shell
db.user.find();
返回user集合的全部文档数据库
相似于关系型数据库的
select * form user数组
添加条件
db.user.find({"age":35,"name":"joe"});
能够解释为:在user集合中查找 age=35而且name="joe" 符合条件的文档。函数
二、指定查询的返回列 工具
db.user.find({"age":35,"name":"joe"},{"_id":1});
只显示"_id"键优化
要是显示name 和 age键
db.user.find({"age":35,"name":"joe"},{"_id":0,"age":1,"name":1});
"_id"剔除须要显式的申明。
2.6 有一个小BUG
就是在
db.user.find({"age":35,"name":"joe"},{"_id":0,"age":1,"name":0});
会抛出如下异常
error:{
"$err":"Can't canonicalize query:BadValue Projection cannoet have mix"
of inclusion and exclusion.",
"coede":17287"
}
目前对这个错误不是很理解。
3.查询的限制
先在user集合中添加firendAge键
db.user.update({},{"$set",{"firendAge":20}},ture,true);
update 的第三个参数的意思是在该键值不存在的时候是否为该文档添加 默认为 false
update 的第四个参数的意思是是否更新整个集合 默认为 false
为何能够动态参数:
是应为MongoDB shell 采用的是javascript shell。
限制:传递给数据库查询文档的值必须是常量
db.user.find({"firendAge":"this.age"})
不是去查询文档firendAge键的值等于age键的值
而是去查询 firendAge="this.age" 的值
4.条件查询
MongoDB的查询不只能像上面的精确匹配,还能匹配更加复杂的条件好比:范围、OR字句、取反
4.1范围查询
在MongoDB中"$lt","$lte","$gt","$gte"分别表明<,<=,>,>=
问题来了:
1)、我要获取user集合中的age大于等于23小于100的文档则怎么办呢?
db.user.find({"age":{"$lte":23,"$gt":100}});
2)、咱们要匹配不等怎么办
匹配不等的话,就要使用另一个操做符"$ne".("$ne" 是支撑全部的类型的数据)
查询年龄不是23岁的;查询名字不叫"jack"的集合
db.user.find({"age":{"$ne":23}});
db.user.find({"name":{"$ne":"jack"}});
3)、如何去匹配日期呢?
瑞然日期在文档中存储是精确到毫秒的,可是咱们想获得一周或者一个月的数据使用范围查询就颇有必要
获取2015-01-01 之后出生的用户
db.user.find({"birthday":{"ge":(new Date("01/01/2015"))}});
5.OR 查询
OR 查询有"$in"和"$or"2种形式
1)、查询用户名 为"jack"或者为"zsh"
db.user.find({"name":{"$in":["jack","zsh"]}});
不在里面的话就使用 "$nin"
二、查询用户名 为"jack"或者为"zsh" 或者年龄为20
db.user.find({"$or":{"name":{"$in":["jack","zsh"],"age":20}});
6.$not
$not 是元条件语句,既能够在其余的条件之上。$mod 取余运算符。表明将查询的值除以第一个值,返回的值为第二个值。
查询user集合中年龄是除以5余3的文档。
db.user.find({"age":{"$mod":[5,3]}});
若想返回其余的用户就能够这样
db.user.find("age":{"$not",{"$mod":[5,1]}});
7.条件语句
在$开头的键位于不一样的位置,在查询语句中$位文档内层,更新语句"$inc" 则位于文档外层的键。
查询年龄20-30的用户
db.user.find({"age":{"$gt":20,"$lt":30}});
更新语句像下面这样写就会报错
db.user.update({},{"$inc":{"age":1},"$set":{"age":20}});
在查询中也有一些"元操做符"能够位于文档外层键入"$and","$ro","$nor"使用方法。
db.user.find({"$and":[{"age":{"$gt":10}},{"age":23}]});
可是能够这样优化效率会高不少。
db.user.find({"age":{"$gt":10,"$in":[4]}});
8.特定的查询
1)null
在MongoDB中是没有"$eq",匹配null不只会查询指定键为null 的文档,还会匹配返回不存在该键的值
要想查询user集合中键y值为null的列表是
db.user.find({"y":{"$in":[null],"$exists":true}});
2)正则表达式
正则表达式能够灵活的匹配字符串。如:查询全部用户中名含有joe或者Joe的用户就可使用正则表达式来匹配。
db.user.find({"name":/^joe/});
正则表达式也能够被存储在数据库中。
9.数组查询