MongoDB深入查询

简单查询

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]}})

51

取反查询$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 }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值