mongo简介

非结构化数据库,数据都是以Bson格式(json的二进制)存储的。

特点:不需要指定表结构,存在一张表里的数据其结构可以完全不同。内部执行引擎为JS解释器, 把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的js语法来操作。

应用场景举例:类似网易云音乐一个音乐下有很多评论,评论之间又可以互相评论,评论下还可以点赞。这样的数据结构如果是按照关系型数据库,可能需要电影表,评论表,点赞表,用户表他们之间又有1对多和多对多的关系,这会造成复杂的查询。而在mongo中可能它只需要一个对象(json的结构)就可以保存如下所示

{

song:’双节棍’,

comments:[

      {content:’很好听’,user_id:1,good:[{user:1,time:'2017-01-01'},{user:3,time:'2017-01-23'},{user:4,time:'2017-05-01'}]},

      {content:’一般吧’,user_id:2}

     ]

}

1: mongo入门命令

show dbs  查看当前的数据库

use databaseName 选库

show tables/collections 查看当前库下的collection

Mongodb的库是隐式创建,你可以use 一个不存在的库,然后在该库下创建collection,即可创建库

db.createCollection(‘collectionName’) 创建collection

db.collectionName.insert({}); collection允许隐式创建

db.collectionName.drop() 删除collection

db.dropDatabase(); 删除database  在use一个database后执行

2:mongo增删改查命令

插入 insert:

db.collectionName.insert({_id:9,gender:'male',name:'QQ'}) 插入单条并指定id;mongo会自动指定id给一条数据

db.collectionName.insert(  [   {time:'friday',study:'mongodb'},  {_id:9,gender:'male',name:'QQ'}  ]  ) 插入多条记录

删除 remove:

删除必要要执行条件{} 不然将清空表

db.collectionName.remove({name:’001’}); 删除name属性为001的全部数据

  db.collectionName.remove({name:’001’,true}); 只删除name属性为001的一行数据

更改 update:

    db.news.update({name:'QQ'},{name:'MSN'});是指选中news表中,name值为QQ的文档,并把其文档值改为{name:’MSN’}相当于重新赋值

    db.collectionName.update({name:'MSN'},{$set:{name:’QQ’},$unset:{age:1}}) 如果是想修改文档的某列,使用$set关键字,如果不存在该字段,就会自动添加上

    修改时的赋值表达式: $set  修改某列的值    $unset 删除某个列  $rename 重命名某个列   $inc 增长某个列

  Option: {upsert:true/false,multi:true/false}

   upsert---是指没有匹配的行,则直接插入该行.(和mysql中的replace一样)

  例:db.stu.update({name:'wuyong'},{$set:{name:'junshiwuyong'}},{upsert:true});

  如果有name=’wuyong’的文档,将被修改,如果没有,将添加此新文档

    multi: 是指修改多行(即使查询表达式命中多行,默认也只改1行,如果想改多行,可以用此选项)

  例:db.news.update({age:21},{$set:{age:22}},{multi:true}); 则把news中所有age=21的文档,都修改

 查询 find :

    以下为转载内容,很全面。

 左边是mongodb查询语句,右边是sql语句。对照着用,挺方便。
db.users.find() select * from users
db.users.find({"age" : 27}) select * from users where age = 27
db.users.find({"username" : "joe", "age" : 27}) select * from users where "username" = "joe" and age = 27
db.users.find({}, {"username" : 1, "email" : 1}) select username, email from users
db.users.find({}, {"username" : 1, "_id" : 0}) // no case // 即时加上了列筛选,_id也会返回;必须显式的阻止_id返回
db.users.find({"age" : {"$gte" : 18, "$lte" : 30}}) select * from users where age >=18 and age <= 30 // $lt(<) $lte(<=) $gt(>) $gte(>=)
db.users.find({"username" : {"$ne" : "joe"}}) select * from users where username <> "joe"
db.users.find({"ticket_no" : {"$in" : [725, 542, 390]}}) select * from users where ticket_no in (725, 542, 390)
db.users.find({"ticket_no" : {"$nin" : [725, 542, 390]}}) select * from users where ticket_no not in (725, 542, 390)
db.users.find({"$or" : [{"ticket_no" : 725}, {"winner" : true}]}) select * form users where ticket_no = 725 or winner = true
db.users.find({"id_num" : {"$mod" : [5, 1]}}) select * from users where (id_num mod 5) = 1
db.users.find({"$not": {"age" : 27}}) select * from users where not (age = 27)
db.users.find({"username" : {"$in" : [null], "$exists" : true}}) select * from users where username is null // 如果直接通过find({"username" : null})进行查询,那么连带"没有username"的纪录一并筛选出来
db.users.find({"name" : /joey?/i}) // 正则查询,value是符合PCRE的表达式
db.food.find({fruit : {$all : ["apple", "banana"]}}) // 对数组的查询, 字段fruit中,既包含"apple",又包含"banana"的纪录
db.food.find({"fruit.2" : "peach"}) // 对数组的查询, 字段fruit中,第3个(从0开始)元素是peach的纪录
db.food.find({"fruit" : {"$size" : 3}}) // 对数组的查询, 查询数组元素个数是3的记录,$size前面无法和其他的操作符复合使用
db.users.findOne(criteria, {"comments" : {"$slice" : 10}}) // 对数组的查询,只返回数组comments中的前十条,还可以{"$slice" : -10}, {"$slice" : [23, 10]}; 分别返回最后10条,和中间10条
db.people.find({"name.first" : "Joe", "name.last" : "Schmoe"}) // 嵌套查询
db.blog.find({"comments" : {"$elemMatch" : {"author" : "joe", "score" : {"$gte" : 5}}}}) // 嵌套查询,仅当嵌套的元素是数组时使用,
db.foo.find({"$where" : "this.x + this.y == 10"}) // 复杂的查询,$where当然是非常方便的,但效率低下。对于复杂查询,考虑的顺序应当是 正则 -> MapReduce -> $where
db.foo.find({"$where" : "function() { return this.x + this.y == 10; }"}) // $where可以支持javascript函数作为查询条件
db.foo.find().sort({"x" : 1}).limit(1).skip(10); // 返回第(10, 11]条,按"x"进行排序; 三个limit的顺序是任意的,应该尽量避免skip中使用large-number

mongo学习笔记---1的更多相关文章

  1. mongo学习笔记(六):linux上搭建

    linux分以下几台 monogos mongocfg mongod1 mongod2 1.用ssh把 mongodb-linux-x86_64-3.0.6.tgz 移到linux /root上 2. ...

  2. mongo学习笔记(五):分片

    分片  人脸:       代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的. mongos: 首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照 ...

  3. mongo 学习笔记

    mysql语句 : ' ,,),(,,)   mongo语句: db.}}).limit() db."}) db.}}) 条件操作符1 mongodb中的条件操作符有: (>) 大于 ...

  4. mongo学习笔记2--索引及表设计

    -背景: 鉴于我们使用mongo作为数据库,期间少不了需要添加索引和对业务表进行设计.因此以下我对mongo索引及表设计原则做了一些分享.希望对大家有用,如有错误还望指正~ MongDB的索引类型简介 ...

  5. Mongo学习笔记

    安装和开始 下载 MongoDB 参考:+MongoDB安装配置(Windows) +Mongo手册

  6. mongo学习笔记(一):增删改查

    安装:我是按这篇来弄的 一.Insert 1.db.person.insert({"name":"jack","age":20}) 2.va ...

  7. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  8. MongoDB学习笔记—权限管理

    1.MongoDB权限介绍 a 上篇文章中,我们在Linux下配置了MongoDB环境并且将其设置为服务随机器启动而启动,那么接下来这篇文章我们就来简单说一下MongoDB下对登录用户权限的管理. b ...

  9. MongoDB学习笔记~环境搭建

    回到目录 Redis学习笔记已经告一段落,Redis仓储也已经实现了,对于key/value结构的redis我更愿意使用它来实现数据集的缓存机制,而对于结构灵活,查询效率高的时候使用redis就有点不 ...

随机推荐

  1. java的几种对象(PO,VO,DAO,BO,POJO,DTO)解释

    一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数 ...

  2. 1.7Oob 方法重载和成员变量,局部变量,构造方法

    1:方法调用,如果值有参方法,必须传递实际参数. 2:方法定义了多少个参数,传递的实际参数就 必须有多少个, 方法的作用:1:描述某个类的作用,2:软件的复用 这个复用率低,作用小,价值很低: 3:

  3. elastricsearch学习笔记

    一.基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT)         Elasticsearch是一个接近实时的搜索平台.这意 ...

  4. 转:WKT、SRID、EPSG概念

    原文地址:WKT.SRID.EPSG概念 EPSG: European Petroleum Survey Group (EPSG), http://www.epsg.org/,它成立于1986年,并在 ...

  5. ES6 Reflect 与 Proxy

    概述 Proxy 与 Reflect 是 ES6 为了操作对象引入的 API . Proxy 可以对目标对象的读取.函数调用等操作进行拦截,然后进行操作处理.它不直接操作对象,而是像代理模式,通过对象 ...

  6. darknet集成遇到的问题以及解决方法

    将darknet集成进工程时,遇到了一些问题,下面记录一下解决方法: 集成步骤: 首先在yolo编译的时候,需要将三个开关打开: #define GPU#define CUDNN#define OPE ...

  7. python tkinter Label

    """小白随笔,大佬勿喷""" #Label标签 用于可显示文本或图片,不可编辑 import tkinter as tk #初始化窗口 w ...

  8. jquery对复选框(checkbox)的操作(精华)

    @{ Layout = null;} <!DOCTYPE html> <html><head> <meta name="viewport" ...

  9. [openjudge-动态规划]Maximum sum

    题目描述 题目原文 描述 Given a set of n integers: A={a1, a2,-, an}, we define a function d(A) as below: d(A)=m ...

  10. 事件冒泡以及onmouseenter 和 onmouseover 的不同

    1. onmouseenter onmouseenter 事件在鼠标指针移动到元素上时触发. 该事件通常与 onmouseleave 事件一同使用, 在鼠标指针移出元素上时触发. onmouseent ...