正文

MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系型数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似Json格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引----【来源百度百科】

一、Mongo的查询语句

公式:

db.collection.find({query filter},{projection})

解释:

  • query filter:查询的条件,类似于MySql中的where语句;可多选
  • projection:列出要查询的数据,可选值为1、0;其中1表示展示,0表示不展示;其中_id属性默认是展示;可多选
  • collection:表示要查询的集合(本文所有例子中默认为app集合)

例子:

  • 查询所有:db.app.find({})
  • 部分查询:db.app.find({_id:3})
  • 键的筛选:db.app.find({},{name:1,_id:0})

说明:

键的筛选是查询时只返回自己感兴趣的键值,通过指定projection来实现。可以节省传输的数据量,又能节省客户端解码文档的时间和内存消耗。

查询条件:

  • 比较查询:通过$lt,$lte,$gt,$gte,$ne来实现,分别对应<,<=,>,>=,!=;它们可以组合起来以查找一个范围内的值
  • 关联查询:通过$in,$nin,$or实现,分别对应在某一个集合中、不在某一个集合中(此处集合与collection集合不同,可以理解成一个键的多个值所组成的数学形式上的集合)以及或逻辑

例子:

  • 查询_id键在20与60之间:db.app.find({_id:{$gt:20,$lt:60}})
  • 查询_id键不为16的所有数据:db.app.find({_id:{$ne:16}})
  • 查询_id键在[1,3,6,7]中的数据:db.app.find({_id:{$in:[1,3,6,7]}})
  • 查询_id键为16或者name为讯飞输入法的数据:db.app.find({$or:[{_id:16},{name:"讯飞输入法"}]})

特殊类型的查询:

  • 查询null:db.app.find({name:{$in:[null]}});查询所有name为null的数据或者name不存在的数据
  • 正则查询:mongo不直接支持模糊查询,但是可以通过正则表达式去实现模糊查询,例如:查询所有app的name以讯飞开头的所有数据:db.app.find({name:/^讯飞/})
  • 内嵌查询:如某个键并不是一个基础的类型,而是一个嵌套的类型,则可以使用内嵌查询,来满足业务需求;例如name键中包含first与last两个子健,要查询所有name中first为讯飞的数据,可以:db.app.find({name.first:"讯飞"})
  • 数组查询:通过$all,$size,$slice实现;分别表示返回满足所有数组元素的数据、满足指定长度的数据以及数组的一个子集合
    • db.app.find({tagIds:{$all:[1,2]}}),只要某数据中tagIds键包含[1,2]数组,就返回
    • db.app.find({tagIds:{$size:3}}),只要某数据中tagIds键中有有三个值,就返回
    • db.app.find({tagIds:{$slice:[1,2]}}),返回偏移量为1,元素个数为2

$where查询:

暂时不会,看某些参考博客上说,这种查询方式不会利用到索引,查询效率较低,不宜使用

limit,skip和sort的使用

limit:限制结果数量,限制的是上限。
skip:略过匹配到的前n个文档,然后返回余下的文档。skip略过过多的文档时会产生性能问题,建议尽量避免。
sort:按照指定的键对文档进行排序,1为升序,-1为降序。

db.app.find({}).limit(20).sort({updatetime:-1})

游标

mongo查询结果其实一个游标,可以通过var cursor = db.app.find({})来获取,可以利用游标来获取结果,也可以达到limit、skip等效果

二、Mongo的update语句

公式:

db.collection.update({update filter},{update key-value},{upsert|multi|writeConcern})

解释:

  • update filter:update的查询条件,与find中query filter差不多
  • update key-value:要更新的update对象
  • upsert:如果不存在update的数据,是否插入新的数据,默认是false,不插入;可选参数
  • multi:默认false。只更新找到的第一条记录;true,更具条件更新全部数据
  • writeConcern:抛出异常级别---没用过

例子:

  • db.app.update({_id:3},{name:"讯飞输入法"});将id等与3的数据更新为{"_id":3,"name":"讯飞输入法"},也即该方法会删除那些没有在update key-value中的出现的键(由于mongo没有回滚机制,个人感觉这个语法很坑)
  • db.app.update({_id:3},{$set:{name:"讯飞输入法"}});将id等于3的数据中键name的值更新为讯飞输入法

针对于update key-value说明:

  • $set:用来指定一个键并更新键值,若键不存在并创建
  • $inc:对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作
  • $unset:主要是用来删除键
  • $push:向文档的某个数组类型的键添加一个数组元素,不过滤重复的数据。添加时键存在,要求键值类型必须是数组;键不存在,则创建数组类型的键
  • $pop:从数组的头或者尾删除数组中的元素,从数组尾部删除:1,从数组头部删除:-1
  • ....

三、Mongo的remove语句

公式:

db.collection.remove({remove filter},{justOne|writeConcern})

解释:

  • remove filter:remove的查询条件,与find中的query filter差不多
  • justOne:为1表示删除一个元素
  • writeConcern:抛出异常级别

列子:

db.app.remove({name:"/^讯飞/"},{justOne:1})

四、Mongo的insert/save语句

公式:

  • db.collection.insert(document)
  • db.collection.save(document)

解释:

document表示要插入的文档

例子:

  • db.app.insert({name:"讯飞输入法",tagIds:[1,2,3,4]})
  • db.app.save({name:"讯飞输入法",tagIds:[1,2,3,4]})

区别:

当主键"_id"不存在时,都是添加一个新的文档,但主健"_id"存在时,就有些不同了;insert:当主键"_id"在集合中存在时,不做任何处理。save:当主键"_id"在集合中存在时,进行更新。

mongo基础---增删改查的更多相关文章

  1. Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)

    day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库:    简称:DataBase ---->DB    数据库即存放数据的仓库, ...

  2. MongoDB 基础增删改查

    增删改查 基础操作 use show dbs show collections db[当前所在数据库] 插入文档 db.collection.insert() db.collection.insert ...

  3. MongoDB学习笔记,基础+增删改查+索引+聚合...

    一 基础了解 对应关系 -> https://docs.mongodb.com/manual/reference/sql-comparison/ database -> database ...

  4. Hibernate基础增删改查语法

    1.创建好Hibernate项目,创建好实体类和测试类,如果不会创建Hibernate项目的同学,点此处:http://www.cnblogs.com/zhaojinyan/p/9336174.htm ...

  5. Mysql数据库基础增删改查常用语句命令

    Mysql增删改查常用语句命令 一.增删改查语句总览 创建: create(创建数据库) 增:insert(插入表数据) 删:drop.delete(删除表.删除表数据) 改:update.alter ...

  6. mongo 语法 增删改查

    1.增 db.collection.insert()与db.collection.save() 都是增加,区别:save()遇到相同_id后,则更新此_id数据. 而insert()则报错 > ...

  7. mysql 基础 增删改查语句

    MySQL:众多关系型数据库中的一种仓库 --数据库箱子 --表数据库:进入mysql 命令行: mysql -uroot -p查看所有数据库: show databases;创建数据库: creat ...

  8. SQL基础增删改查

    一.基础语句介绍 SQL 可以分为两个部分:数据操作语言(DML)和数据定义语言(DDL) 1.数据操作语言(DML)基本指令: select       从数据表中获取数据(现阶阶段,二次开发常用) ...

  9. 关于oracle的基础增删改查操作总结

    ① 进入数据库: sqlplus“/as sysdba” 或者sqlplus / as sysdba 注:完整格式:  sqlplus“用户名/密码@数据库名as sysdba” 注:请注意,sqlp ...

随机推荐

  1. 关于EditText.setText()无法显示的问题

    将EditText在初始化后调用EditText.setSaveEnabled(false); 让Android 系统不保存值,这样就不会恢复了.

  2. [转载]Python: 你不知道的 super

    原文出处: geekvi super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用  ...

  3. C后端设计开发 - 第3章-气功-原子锁线程协程

    正文 第3章-气功-原子锁线程协程 后记 如果有错误, 欢迎指正. 有好的补充, 和疑问欢迎交流, 一块提高. 在此谢谢大家了. 童话镇 - http://music.163.com/#/m/song ...

  4. springboot基础知识学习

    一.springboot中常用的注解: 原文链接:http://blog.csdn.net/lafengwnagzi/article/details/53034369 原文链接:http://www. ...

  5. clearcase command (windows 常用的几个)

    command 1. setview  指定某个view你可以操作,否则你将看不到文件,ls,cd 等其它命令无效 setview  viewname 2. rename branch type na ...

  6. [How to]如何自定义plist文件和读取plist文件内容

    1.简介 plist作为IOS的固化文件,就好比java中properties文件,但是在IOS中plist是可读写的. 本文将介绍自定义静态的plist文件. 2.自定义静态plist文件 右击你的 ...

  7. Geoserver发布缓存切片(制定Gridsets)

    EPSG:4326 Level Pixel Size Scale Name Tiles   0 1: 2 x 1   1 1: 4 x 2   2 1: 8 x 4   3 1: 16 x 8   4 ...

  8. 虚拟机 VMware Workstation12 安装OS X 系统

      Windows下虚拟机安装Mac OS X —– VMware Workstation12安装Mac OS X 10.11 本文即将介绍WIN虚拟MAC的教程.完整详细教程(包含安装中的一些问题) ...

  9. Leetcode 之Longest Palindromic Substring(30)

    很经典的一道题,最长回文子串,有多种方法. 首先介绍的一种方法是从中间向两边展开.注意区分aba和abba型的回文串:如果当前最长的子串已经当于两边中最长的子串了,则无需再去判断. //从中间向两边展 ...

  10. 《java并发编程实战》读书笔记8--死锁,性能与可伸缩性,锁粒度锁分解锁分段

    第10章 避免活跃性危险 10.1 死锁 -10.1.1 锁顺序死锁 最简单的一种死锁形式: -10.1.2 动态的锁顺序死锁 可以通过下面的方法来解决: -10.1.3 在协作对象之间发生死锁 -1 ...