设为首页 收藏本站
查看: 1020|回复: 0

[经验分享] MongoDB查询系统

[复制链接]

尚未签到

发表于 2017-12-15 11:06:31 | 显示全部楼层 |阅读模式
  首先,我们先向集合(collections)中添加测试文档(documents)。如下:
  > for(i=1;i<=5;i++) db.test.insert({x:i,y:i*i,z:6-i})
  WriteResult({ "nInserted" : 1 })
  1、下面查看我们插入的数据:
  > db.test.find()
  { "_id" : ObjectId("59361be7c718d6f408c6cae5"), "x" : 1, "y" : 1, "z" : 5 }
  { "_id" : ObjectId("59361be7c718d6f408c6cae6"), "x" : 2, "y" : 4, "z" : 4 }
  { "_id" : ObjectId("59361be7c718d6f408c6cae7"), "x" : 3, "y" : 9, "z" : 3 }
  { "_id" : ObjectId("59361be7c718d6f408c6cae8"), "x" : 4, "y" : 16, "z" : 2 }
  { "_id" : ObjectId("59361be7c718d6f408c6cae9"), "x" : 5, "y" : 25, "z" : 1 }
  2、只查看部分数据字段
  > db.test.find({},{_id:0,x:1})
  { "x" : 1 }
  { "x" : 2 }
  { "x" : 3 }
  { "x" : 4 }
  { "x" : 5 }(其中,第一个{}中是筛选条件,第二个{}中是决定哪些数据字段显示,即过滤器,0表示不显示,1表示显示)
  3、按指定条件筛选数据
  > db.test.find({x:1},{_id:0})
  { "x" : 1, "y" : 1, "z" : 5 }
  4、比较部分
  操作
  格式
  范例
  等于
  {<key>:<value>}
  db.col.find({x:1,y:1}).pretty()
  小于
  {<key>:{$lt:<value>}}
  db.col.find({x:{$lt:3}}).pretty()
  小于或等于
  {<key>:{$lte:<value>}}
  db.col.find({x:{$lte:3}}).pretty()
  大于
  {<key>:{$gt:<value>}}
  db.col.find({x:{$gt:3}}).pretty()
  大于或等于
  {<key>:{$gte:<value>}}
  db.col.find({x:{$gte:3}).pretty()
  不等于
  {<key>:{$ne:<value>}}
  db.col.find({x:{$ne:1}}).pretty()
  范围选择1
  {<key>:{$lt:<val>,$gte:<val>}}
  db.test.find({x:{$lt:4,$gte:2}})
  范围选择2
  {<key>:{$in:[value1,value2]}}
  db.test.find({x:{$in:[1,2]}})
  范围选择3
  {<key>:{$nin:[value1,value2]}}
  db.test.find({x:{$nin:[1,2]}})
  其中,$nin、$ne等是一种比较低效的查询选择器,它们会进行全表扫描,因此,最好不要单独使用。并且单独使用$ne也不会利用索引的优势,非常低效。
  5、And与Or
  操作
  格式
  范例
  效果
  And
  {$and:[{<key>:<value>},{}....]}
  db.test.find({$and:[{x:2},{y:4}]},{_id:0})
  { "x" : 2, "y" : 4, "z" : 4 }
  Or
  {$or:[{<key>:<value>},{}....]}
  db.test.find({$or:[{x:2},{y:1}]},{_id:0})
  { "x" : 1, "y" : 1, "z" : 5 }
  { "x" : 2, "y" : 4, "z" : 4 }
  And Or
  省略
  db.test.find({x:{$lt:4},$or:[{y:4},{z:5}]},{_id:0})
  { "x" : 1, "y" : 1, "z" : 5 }
  { "x" : 2, "y" : 4, "z" : 4 }
  6、exists
  在mongodb中$exists与关系数据库中的exists不一样,因为在MongoDB中表(集合collection)结结构不是固定的,有的时候需要返回包含有某个字段的所有记录或者不包含某个字段的所有字段,$exists这时就可以派上用场了。此处我们为了测试就在插入一条数据:
  > db.test.insert({x:1,y:1,flag:true})
  WriteResult({ "nInserted" : 1 })
  下面我们假设需要访问包含flag字段的文档,如下:
  > db.test.find({flag:{$exists:true}})
  { "_id" : ObjectId("59364d6561dce208b23fc306"), "x" : 1, "y" : 1, "flag" : true }
  当然,为了实现这种需求,我们也可以用另外一种语句来代替$exists
  > db.test.find({flag:{$ne:null}})
  { "_id" : ObjectId("59364d6561dce208b23fc306"), "x" : 1, "y" : 1, "flag" : true }
  7、嵌套查询
  下面,向test中添加一个嵌套形式的数据,即某个字段的值也是一个BSON对象
  > db.test.insert({id:1,name:"xiaoming",detail:{sex:"male",age:20}})
  WriteResult({ "nInserted" : 1 })
  > db.test.find({"detail.age":20}).pretty()
  {
  "_id" : ObjectId("5936507961dce208b23fc307"),
  "id" : 1,
  "name" : "xiaoming",
  "detail" : {
  "sex" : "male",
  "age" : 20
  }
  }
  嵌套查询时匹配的key如果有多级嵌套深度,就一级一级地用点号展开
  8、数组操作
  > db.test.insert({id:1,name:"xiaoliang",detail:[{sex:"male",age:22},{address:"china",post:5}]})
  WriteResult({ "nInserted" : 1 })
  > db.test.find({"detail.1.post":5}).pretty()
  {
  "_id" : ObjectId("593655b461dce208b23fc308"),
  "id" : 1,
  "name" : "xiaoliang",
  "detail" : [
  {
  "sex" : "male",
  "age" : 22
  },
  {
  "address" : "china",
  "post" : 5
  }
  ]
  }
  匹配字符串中先取需要匹配的key(detail),由于detail键对应的value为数组,detail.1表示要取数组中的第2个位置处的元素,又由于数组的元素有是个BSON文档对象,因此,我们可以通过detail.1.post定位到需要匹配的键。
  9、查询最新数据
  > db.ttt.find().pretty()
  {
  "_id" : ObjectId("593270bd0976e8f92b2d4514"),
  "id" : 1,
  "StatusInfo" : [
  {
  "status" : 9,
  "desc" : "已取消"
  },
  {
  "status" : 2,
  "desc" : "已付款"
  }
  ]
  }
  这是我们的测试数据,在现实需求中我们经常遇到需要查询的是最新数据,对于数据类型,我们有专门的操作符$silce来完成
  > db.ttt.find({id:1},{_id:0,"StatusInfo":{"$slice":-1},"StatusInfo.desc":1})
  { "StatusInfo" : [ { "desc" : "已付款" } ] }
  10、正则查询
  > db.test.find({age:20})
  { "_id" : ObjectId("59365ce461dce208b23fc309"), "name" : "zhangsan", "age" : 20 }
  { "_id" : ObjectId("59365ced61dce208b23fc30a"), "name" : "zhanan", "age" : 20 }
  查询"name"以"zhan"开头的数据:
  > db.test.find({name:{$regex:"zhan"}})
  { "_id" : ObjectId("59365ce461dce208b23fc309"), "name" : "zhangsan", "age" : 20 }
  { "_id" : ObjectId("59365ced61dce208b23fc30a"), "name" : "zhanan", "age" : 20 }
  当然还是可以这样的:
  > db.test.find({name:/zhan/})
  { "_id" : ObjectId("59365ce461dce208b23fc309"), "name" : "zhangsan", "age" : 20 }
  { "_id" : ObjectId("59365ced61dce208b23fc30a"), "name" : "zhanan", "age" : 20 }
  > db.test.find({name:/han/})
  { "_id" : ObjectId("59365ce461dce208b23fc309"), "name" : "zhangsan", "age" : 20 }
  { "_id" : ObjectId("59365ced61dce208b23fc30a"), "name" : "zhanan", "age" : 20 }
  忽略大小写查询
  > db.test.find({name:{$regex:"zhan",$options:"$i"}})
  { "_id" : ObjectId("59365ce461dce208b23fc309"), "name" : "zhangsan", "age" : 20 }
  { "_id" : ObjectId("59365ced61dce208b23fc30a"), "name" : "zhanan", "age" : 20 }
  { "_id" : ObjectId("59365f1161dce208b23fc30b"), "name" : "ZHANbsd", "age" : 22 }
  > db.test.find({name:/zhan/i})
  { "_id" : ObjectId("59365ce461dce208b23fc309"), "name" : "zhangsan", "age" : 20 }
  { "_id" : ObjectId("59365ced61dce208b23fc30a"), "name" : "zhanan", "age" : 20 }
  { "_id" : ObjectId("59365f1161dce208b23fc30b"), "name" : "ZHANbsd", "age" : 22 }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424313-1-1.html 上篇帖子: Python 操作 mongodb 数据库 下篇帖子: 安装mongodb以及使用Robomongo(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表