基本查询
不支持join,不能引用文档其他键的值。
db.users.find({"username":"joe","age":27})
- 返回部分文档
_id默认返回,除非明确指定不返回
db.users.find({"username":"joe","age":27},{"username":1,"age":1,"_id":0})//1返回,0不返回
查询条件
- $lt <
- $lte <=
- $gt >
- $gte >=
- $eq ==
- $ne !=
db.users.find({"age",{"$gte":18,"$lt":20}})//18<=age<20
- 范围查询条件$in
db.users.find({"username":{"$in":["zhangsan","lisi","wanger"]}})
$or多个键联合检索
db.users.find({"or":{"username":{"$in":["zhangsan","lisi"]},
{"age":{"gt":20}}})
$not与正则表达式联合使用,查询与条件不符的文档
db.users.find({"id_num":{"mod":[2,0]}})//返回偶数
db.users.find({"id_num":{"$not":{"mod":[2,0]}}})//奇数
有没有发现检索条件是从最内层向外解析,条件越复杂嵌套越深
特定类型查询
- null 即表示键不存在,有表示value为null。$exists条件判断键已经存在
db.users.find({"age":null})//age为空或键不存在均返回
db.users.find({"age":{"eq":null}})//age值为null
- 正则。检索条件可以是正则表达式
db.users.find({"name":/joe?/i})//正则标识i不是必须
- 数组
db.food.find({"fruit":["apple","banana"]})//精确匹配内容,顺序
db.food.find({"fruit":{"$all":["apple","banana"]}})//包含元素即可
$size返回指定长度的数组,但是不能和其他查询子句组合,限制了他的使用
db.food.find({"fruit":{"size":3})
$slice返回数组的部分元素
db.blog.posts.find(query,{"comment":{"$slice":10}})//10返回头10个,返回尾10个
db.blog.posts.find(query,{"comment":{"$slice":[23,10]}})//23-33
- 内嵌文档
$elemMatcth部分指定匹配数组中单个内嵌文档的限定条件
db.meters.find({"contents.type":0})
db.meters.find({"contents":{"$elemMatch":{"value":"insert","type":{"$gte":5}}}})
//contents.value="insert" and contents.type>=5
- &where javascript函数查询,速度很慢且不能使用索引
db.meters.find({"$where":function(){}})
db.meters.find({"$where":"this.key1 == this.key2"})//key1==key2返回
游标
游标将结果缓存在服务器端,分批返回。游标使用后应尽快释放
var cursor = db.meters.find();
while(cursor.hasNext()){
var obj = cursor.next()//取得文档
}
limit,skip,sort,cursor只有在调用hasNext才会检索数据库,所以limit,skip,sort方法调用无先后顺序
注意不要skip太多,影响性能。
db.meters.find().limit(3)//最多返回3个匹配结果
db.meters.find().skip(3)//跳过前三个
db.meters.find().sort({"type":1})//结果按照type升序返回
还有一些高级查询
maxscan:integer最多扫描文档数量min:document
hint:document服务器使用了哪个索引explain:boolean 查询执行的细节
$snapshot:boolean 快照