MongoDB学习笔记

      对于MongoDB来讲视图工具备MongoDB VUE等,我的不是很习惯使用视图工具,因此比较喜欢使用MongoDB自带的javascript shell。不是你们所谓的提高B格,只是我的习惯。一下的一些内容参考自《MongoDB 权威指南2》.javascript

     在个人bin下面有一个js脚本我执行一下命令即可以完成调用。java

mongo script1.js
mongo --quiet script1.js [不打印MongDB shell Version ...]
load("script1.js") 登陆后执行

   

MongoDB 查询

  本篇博客主要包括如下内容:
  一、使用find或者findOne 函数和查询文档数据库执行查询。
  二、使用$条件查询实现分为查询数据集包含查询、不等式查询,以及其余查询
  三、查询返回一个数据库游标,游标只会在你须要时才会将须要的文档批量返回。
  四、针对游标的元数据操做,包括忽略必定数量的结果,或者限定返回结果的数量,或者限定返回结果的数量,以对结果集的排序正则表达式

1.1 find

  MongoDB 中使用find查询就是返回一个集合中的子文档,范围从0个文档到整个集合。find的第一个参数决定了要返回那些文档,这个参数是一个文档。用于指定查询条件。sql

  一、基本查询  shell

  db.user.find();
  返回user集合的全部文档数据库

  相似于关系型数据库的
  select * form user数组

  添加条件
  db.user.find({"age":35,"name":"joe"});
  能够解释为:在user集合中查找 age=35而且name="joe" 符合条件的文档。函数

  二、指定查询的返回列  工具

  db.user.find({"age":35,"name":"joe"},{"_id":1});
  只显示"_id"键优化

  要是显示name 和 age键
  db.user.find({"age":35,"name":"joe"},{"_id":0,"age":1,"name":1});

 "_id"剔除须要显式的申明。

  2.6 有一个小BUG
  就是在
  db.user.find({"age":35,"name":"joe"},{"_id":0,"age":1,"name":0});
  会抛出如下异常
  error:{
  "$err":"Can't canonicalize query:BadValue Projection cannoet have mix"
  of inclusion and exclusion.",
  "coede":17287"
  }

  目前对这个错误不是很理解。

  3.查询的限制 

  先在user集合中添加firendAge键
  db.user.update({},{"$set",{"firendAge":20}},ture,true);

  update 的第三个参数的意思是在该键值不存在的时候是否为该文档添加 默认为 false
  update 的第四个参数的意思是是否更新整个集合 默认为 false
  为何能够动态参数:
  是应为MongoDB shell 采用的是javascript shell。

  限制:传递给数据库查询文档的值必须是常量
  db.user.find({"firendAge":"this.age"})
  不是去查询文档firendAge键的值等于age键的值
  而是去查询 firendAge="this.age" 的值

  4.条件查询 

  MongoDB的查询不只能像上面的精确匹配,还能匹配更加复杂的条件好比:范围、OR字句、取反
  4.1范围查询
  在MongoDB中"$lt","$lte","$gt","$gte"分别表明<,<=,>,>=
  问题来了:
  1)、我要获取user集合中的age大于等于23小于100的文档则怎么办呢?
  db.user.find({"age":{"$lte":23,"$gt":100}});

  2)、咱们要匹配不等怎么办
  匹配不等的话,就要使用另一个操做符"$ne".("$ne" 是支撑全部的类型的数据)
  查询年龄不是23岁的;查询名字不叫"jack"的集合
  db.user.find({"age":{"$ne":23}});
  db.user.find({"name":{"$ne":"jack"}});

  3)、如何去匹配日期呢?
  瑞然日期在文档中存储是精确到毫秒的,可是咱们想获得一周或者一个月的数据使用范围查询就颇有必要
  获取2015-01-01 之后出生的用户
  db.user.find({"birthday":{"ge":(new Date("01/01/2015"))}});

  5.OR 查询 

  OR 查询有"$in"和"$or"2种形式
  1)、查询用户名 为"jack"或者为"zsh"
  db.user.find({"name":{"$in":["jack","zsh"]}});
  不在里面的话就使用 "$nin"
  二、查询用户名 为"jack"或者为"zsh" 或者年龄为20
  db.user.find({"$or":{"name":{"$in":["jack","zsh"],"age":20}});

 6.$not

  $not 是元条件语句,既能够在其余的条件之上。$mod 取余运算符。表明将查询的值除以第一个值,返回的值为第二个值。

  查询user集合中年龄是除以5余3的文档。

  db.user.find({"age":{"$mod":[5,3]}});

  若想返回其余的用户就能够这样

  db.user.find("age":{"$not",{"$mod":[5,1]}});

  7.条件语句

   在$开头的键位于不一样的位置,在查询语句中$位文档内层,更新语句"$inc" 则位于文档外层的键。

  查询年龄20-30的用户  

db.user.find({"age":{"$gt":20,"$lt":30}});

  更新语句像下面这样写就会报错 

db.user.update({},{"$inc":{"age":1},"$set":{"age":20}});

 在查询中也有一些"元操做符"能够位于文档外层键入"$and","$ro","$nor"使用方法。 

db.user.find({"$and":[{"age":{"$gt":10}},{"age":23}]});

  可是能够这样优化效率会高不少。

db.user.find({"age":{"$gt":10,"$in":[4]}});

 8.特定的查询

 1)null

  在MongoDB中是没有"$eq",匹配null不只会查询指定键为null 的文档,还会匹配返回不存在该键的值

  要想查询user集合中键y值为null的列表是

db.user.find({"y":{"$in":[null],"$exists":true}});

 2)正则表达式

 正则表达式能够灵活的匹配字符串。如:查询全部用户中名含有joe或者Joe的用户就可使用正则表达式来匹配。

db.user.find({"name":/^joe/});

 

正则表达式也能够被存储在数据库中。

9.数组查询

相关文章
相关标签/搜索