MongoDB查询
find查询
find的第一个参数是返回哪些文档,类是于sql里面的where语句
如在集合user里面就是
> db.user.find()
其中默认参数为{},默认会查询全部的内容。当我们在查询文档中添加键值,就表示了查询的条件,如:
> db.user.find() { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" } { "_id" : ObjectId("51ba745f5fdf5d2d7426eb35"), "abc" : 123, "age" : 1 } > db.user.find({age:2}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" } >
查询多个键值时
> db.user.find({age:2}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" } > db.user.find({age:2,username:'wangwu'}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" } > db.user.find({age:2,username:'wangwu',password:'abc'}); >
指定返回键
有时候我们并不需要所有满足条件的都返回,可以用find的第二个参数来指定想要的键,这样即会节约传输的数据量,也会节约客户端的解析时间。
当我们需要的时候就将指定键的值设置为1,不需要就设置为0,其中_id为必须返回值
> db.user.find({age:2},{username:0}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a" } > db.user.find({age:2},{username:1}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "username" : "wangwu" }
查询条件
操作符 | 表示 |
$lt | < |
$lte | <= |
$gt | > |
$gte | >= |
例如查询年龄在(1,10)之间的文档
> db.user.find({age:{$lt:10,$gt:1}}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" }
or查询
MongoDB中的or查询有两种方式
$in可以用来查询一个键的多个值,和sql里面的in类似
> db.user.find({age:{$in:[1,2]}}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" } { "_id" : ObjectId("51ba745f5fdf5d2d7426eb35"), "abc" : 123, "age" : 1 } >
$or用来完成多个键的任意给定值,和sql的or类似,
> db.user.find({$or:[{age:2},{abc:123}]}) { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" } { "_id" : ObjectId("51ba745f5fdf5d2d7426eb35"), "abc" : 123, "age" : 1 } >
or里面还可以包含其他条件,如将age的条件2修改成前面的$in:[1,2]。
特定类型查询
null
匹配null和不存在类型,如果要只匹配null需要用$exists:true来来判断
正则表达式
正则表达式能够灵活的匹配字符串
ps.有点类是于sql里面的like,但是比like要灵活的多
语法以/开头/结尾,和javascript中的正则表达式相同
如查询用户名中包含w的用户
> db.user.find({username:/w/}) { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" }
查询数组
直接查询
> db.user.find({arr:2}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" }
匹配多个 $all
> db.user.find({arr:{$all:[2,3]}}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" } >
查询指定长度的数组 $size
> db.user.find({arr:{$size:3}}); > db.user.find({arr:{$size:4}}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" } >
返回指定的数据条数 $slice
> db.user.findOne({age:2},{arr:{$slice:2}}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3 ], "password" : "a", "username" : "wangwu" } >
$where查询
$where可以执行任意javascript语句作为查询的一部分
> db.user.find({$where:function(){if(this.age==2)return true ; return false;}}); { "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [ 2, 3, 3, 4 ], "password" : "a", "username" : "wangwu" } >
游标
数据库使用游标来返回find的执行结果
当调用find的时候,shell并不立即查询数据库,而是等待真正开始获取结构的时候才发送查询请求。
limit(n) 限制返回结构数量
skip(n) 忽略指定数量
sort ({x1:n1,x2:n2……}) 排序n为1升序 –1 降序