简单查询
db.users.findOne()
不指定条件,返回集合的第一条文档
指定条件时,返回匹配的第一条文档
db.users.find()
不指定条件,返回集合的所有文档
指定条件,返回匹配条件的所有文档
多个条件的查询
db.users.find({"uname":"hxf1","uuid":1})
find命令的第二个参数
db.users.find({参数1},{参数2})
参数1:条件
参数2:指定返回的键
db.users.find({"uname":"hxf1","uuid":1},{"uuid" : 1,"salary" :1})
1代表true
{ "_id" : ObjectId("5c7b413c28ec3e09ea7dcdcb"), "uuid" : 1, "salary" : 13567 }
此时_id还是显示出来,如果不想让_id显示出来
db.users.find({"uname":"hxf1","uuid":1},{"uuid" : 1,"salary" :1,"_id":0})
{ "uuid" : 1, "salary" : 13567 }
ObjectId()
> new ObjectId()
ObjectId("5c7bc7c239332f0d15d765ed")
> new ObjectId()
ObjectId("5c7bc7d039332f0d15d765ee")
> new ObjectId()
ObjectId("5c7bc7d439332f0d15d765ef")
最后一位是计数器
前8位是时间戳(加入时间戳的因素保证唯一性)
> a= new ObjectId()
ObjectId("5c7bc8db39332f0d15d765f0")
> a.getTimestamp()
ISODate("2019-03-03T12:30:19Z")
> a.getTimestamp().getTime()
1551616219000 //毫秒
> a.getTimestamp().getTime()/1000
1551616219 //秒
> b=a.getTimestamp().getTime()/1000
1551616219
> b.toString(16)
5c7bc8db
39332f0d15d:前6位是机器码,后4位是线程id
最后6位是计数器
比较操作符:$gt,$gte,$lt,$lte
gt大于 lt小于 e等于
db.users.find({"uuid":{"$gt":15}})
db.users.find({"uuid":{"$gte":15}})
db.users.find({"uuid":{"$lt":5}})
db.users.find({"uuid":{"$lte":5}})
db.users.find({"uuid":{"$gte":15,"$lte":16}})
$in/$nin/$or查询
db.users.find({"uuid":{"$in":[15,16]}})
db.users.find({"uuid":{"$in":[15,16]},"uname":"hxf15"}) //且的关系,同时满足
db.users.find({ "$or" : [ { "uuid":{"$in":[15,16]} },{ "uname":"hxf1" } ] })
$mod取模运算
查找用户id为1,6,11,16等的用户?
db.users.find({"uuid":{"$mod":[5,1]}})
除5余1
取反查询$ne,$not
db.users.find({"uuid":{"$ne":1}}) //取uuid<>1的所有文档
db.users.find({"uname":{"$ne":"hxf1"},"uuid":{"$nin":[3,4,5]}})
//取uname<>hxf且uuid not in (3,4,5)
db.users.find({"uname":{"$ne":"hxf1"},"uuid":{"$not" : {"$in":[3,4,5]} } })
//取uname<>hxf且uuid not in (3,4,5)
正则表达式的查询
^匹配开头,$匹配结尾,*匹配任意个字符
.匹配一个字符,\d匹配数字 \D匹配非数字
\w匹配单词字符 :大小写字母或数字
\W匹配非单词字符
整体结构: /…/
查找uname以大写H开头或者小写h开头的文档:
db.users.find({"uname":/^H/},{"_id":0})
db.users.find({"uname":/^h/},{"_id":0})
查找uname以h开头的文档,不区分大小写:
db.users.find({"uname":/^h/i},{"_id":0})
查找uname以h开头,并且以11或者1结尾的文档(不区分大小写):
db.users.find({"uname":/11$/i},{"_id":0})
db.users.find({"uname":/1$/i},{"_id":0})
查找uname以数字结尾的文档:
db.users.find({"uname":/\d$/i},{"_id":0})
查找uname以非数字结尾的文档:
db.users.find({"uname":/\D$/i},{"_id":0})
查找uname以单词字符结尾的文档:
db.users.find({"uname":/\w$/i},{"_id":0})
查找uname以非单词字符结尾的文档:
db.users.find({"uname":/\W$/i},{"_id":0})
{ "uuid" : 3, "uname" : "HXF#", "salary" : 6528 }
查找uname由3个字符所组成的文档
db.users.find({"uname":/^...$/i},{"_id":0})
查找uname包含m的字符所组成的文档
db.users.find({"uname":/m./i},{"_id":0}) // m后至少有一个字符
db.users.find({"uname":/m.*/i},{"_id":0})
//表示m后可以有任意个字符,或m可结尾 等同于db.users.find({"uname":/m/},{"_id":0})
查找uname以包含m且以5结尾的字符所组成的文档
db.users.find({"uname":/m.*5$/i},{"_id":0})
查找uname以包含f字符所组成的文档
db.users.find({"uname":/f/i},{"_id":0})
查找uname的字符数大于等于6
db.users.find({"uname":/.{6}/},{"_id":0})
NULL的涵义
a.值为NULL
b.键不存在
db.users.find({"uname":null},{"_id":0})
{ "uuid" : 7, "uname" : null, "salary" : 3662 }
{ "uuid" : 8, "salary" : 2860 }
db.users.find({"uname":{"$in":[null],"$exists":true}},{"_id":0})
//返回的是值为null,且字段存在的值
{ "uuid" : 7, "uname" : null, "salary" : 3662 }
数组查询
查询包含某个匹配的元素
email是一个数组键,包含c的文档
db.users2.find({"email":"c"})
.$all同时匹配多个元素
db.users2.find({"email":{"$all":["c","d","e"]} })
.$in只要匹配其中元素
db.users2.find({"email":{"$in":["c","d","e"]} })
.$size匹配数组大小
db.users2.find({"email":{"$size":4} })
$slice返回数组的子集
> db.users2.find({"email":{"$size":4} },{"email":{"$slice":[1,2]},"_id":0})
{ "uuid" : 1, "uname" : "hxf", "contact" : { "addr" : "shanghai", "code" : "1", "qq" : "1234567" }, "email" : [ "b", "c" ] }
> db.users2.find({"email":{"$size":4} },{"email":{"$slice":[1,2]},"_id":0,"uuid":1})
{ "uuid" : 1, "email" : [ "b", "c" ] }
"$slice":[1,2]:下标从1开始,取2个值
查找内嵌文档
db.users2.find({"contact.addr":"beijing"})
如果addr是number(number=123,用“123”无法查询出来,只能用123查询出来)
$where 条件查询
$where :能执行任意的javascripts作为查询的一部分
$where慢的原因
- 逐行的扫描
- 每个文档都要从BSON转化为javascript对象
- BSON和javascript对象使用不同的引擎
- 不能使用索引
使用BSON的情况
- 当常规查询都无法满足条件,确实走投无路时。
- 常规查询作为前提过滤条件,第二步后配合$where优化
{ "uid" : 1, "fovartite" : 5, "get" : 3 }
{ "uid" : 2, "fovartite" : 3, "get" : 3 }
{ "uid" : 3, "fovartite" : 6, "get" : 4 }
{ "uid" : 4, "fovartite" : 6, "get" : 4 }
查询键不同但键的值相同的记录:
> db.users3.find({ "$where": function(){
... for (currkey in this ) {
... for(nextkey in this ) {
... if(currkey!=nextkey && this[currkey]==this[nextkey])
... return true ;
... }
... }
... return false ;
... }})
{ "_id" : ObjectId("5c7c8cf5f06511831a4a6b07"), "uid" : 2, "fovartite" : 3, "get" : 3 }
{ "_id" : ObjectId("5c7c8d0ff06511831a4a6b09"), "uid" : 4, "fovartite" : 6, "get" : 4 }
this:代表当前行
游标
游标是存放查询结果的临时缓冲区,游标变量是一种对象类型,它存储的是查询语句。只有当取结果时,才把查询语句发往服务器上执行,返回结果
> a=db.users3.find({"uid":1})
{ "_id" : ObjectId("5c7c8ce6f06511831a4a6b06"), "uid" : 1, "fovartite" : 5, "get" : 3 }
> b=db.users3.findOne({"uid":1})
{
"_id" : ObjectId("5c7c8ce6f06511831a4a6b06"),
"uid" : 1,
"fovartite" : 5,
"get" : 3
}
a:游标对象
b:是文档对象
> var a = db.users3.find({"uid":1})
> a.hasNext()
true
> var c = a.next()
> a.hasNext()
false
> a.next()
2019-03-04T10:54:59.366+0800 E QUERY [thread1] Error: error hasNext: false :
> c(文档)
{
"_id" : ObjectId("5c7c8ce6f06511831a4a6b06"),
"uid" : 1,
"fovartite" : 5,
"get" : 3
}
> c.get=7
> db.users3.save(c)
{ "uid" : 1, "fovartite" : 5, "get" : 7 }
游标的应用—求get的总和
> var a = db.users3.find()
> var sum =0
> while(a.hasNext()){
... var c=a.next();
... sum+=c.get;
... }
18
limit,sort,skip
Limit 限制返回的文档数量,它是对结果的最后处理
sort({})按键值对的条件排序
skip跳过前面的N条文档
db.users3.find({},{"_id":0}).sort({"uid":1}) //1是升序,-1是降序
db.users3.find({},{"_id":0}).sort({"uid":-1,"fovartite":1}) //条件可以组合,先按uid降序,如果uid相同的情况下按fovartite的升序
> db.users3.find({},{"_id":0}).limit(2)
{ "uid" : 1, "fovartite" : 5, "get" : 7 }
{ "uid" : 2, "fovartite" : 3, "get" : 3 }
> db.users3.find({},{"_id":0}).limit(2).skip(2)
{ "uid" : 3, "fovartite" : 6, "get" : 4 }
{ "uid" : 4, "fovartite" : 6, "get" : 4 }
db.users3.find({},{"_id":0}).sort({"uid":1}).limit(2)
{ "uid" : 1, "fovartite" : 5, "get" : 7 }
{ "uid" : 2, "fovartite" : 3, "get" : 3 }
db.users3.find({},{"_id":0}).sort({"uid":1}).limit(2).skip(2)
{ "uid" : 3, "fovartite" : 6, "get" : 4 }
{ "uid" : 4, "fovartite" : 6, "get" : 4 }