一、插入

MongoDB的插入操作很简单,使用insert方法,这里演示从创建数据库、创建集合到插入文档、查询文档。

集合创建方法参数说明:

size:集合最大空间

max:集合最多文档数量

(超出size和max限制都会删除最早的记录)

二、删除

MongoDB删除操作也很简单,使用remove方法,这里演示删除刚刚插入的文档。

remove函数如果没有传参数,直接调用则是删除集合中所有文档。

三、更新

为了方便下面的演示,我事先在刚刚创建的‘blog’集合中插入了4个文档:

1. 替换整个文档(这里演示替换第一个文档):

(这种情况下_id不变,若是要更新_id请注意防止键冲突)

2. 使用修改器更新文档指定部分:

(1)$inc:数字增加/减少

(若对应键不存在则会先创建键,若键对应值不是数字则会报错)

(2)$set:设置键值

(可以操作多种数据类型,可以改变键值的数据类型,还可以用于修改内嵌文档,若对应键不存在则会先创建键)

(3)$unset:删除某个键

(4)$push:若对应键已存在则会向已有数组末尾加入一个元素,否则会创建一个新的数组。

(5)$addToSet:如果一个值不在数组里面就把它加进去,使用方法和$push一样,只是不能添加重复的元素。

将$addToSet和$each组合起来,可以一次向数组中添加多个不同的值。

(6)$pop:从数组任何一端删除一个元素。

(貌似负数都是从头部删除,0和正数都从末尾删除)

(7)$pull:删除数组中所有符合条件的元素。

(8)使用数组下标选择需要修改的数组元素:

(9)使用定位符选择需要修改的数组元素:

修改器速度:

$inc不需要改变文档大小,所以速度非常快。

数组修改器可能更改了文档大小,速度比较慢。

$set在文档大小不发生变化时速度比较快,否则性能也会有所下降。

MongoDB预留了些补白给文档来适应大小变化,但要是超出了原来的空间,还是要分配一块新的空间。

要是$push成为瓶颈,可以将内嵌数组独立出来,放到单独一个集合里面。

3. upsert:

如果存在符合条件的文档则更新,否则以匹配条件和更新文档为基础插入文档。

将update()函数的第三个参数设置为true即可。

4. save:shell函数,文档不存在时插入,存在时更新。

函数参数为一个文档,若文档存在‘_id’键则调用upsert,否则调用insert。

5. 更新多个文档:

默认情况下,更新只能对符合匹配条件的第一个文档执行操作,要使所有匹配到的文档都得到更新,

可以设置update()函数的第4个参数为true。(这个行为今后可能会被更改)

若想知道到底更新了多少文档,可以运行命令:

db.runCommand({getLastError:1})

打印出来的结果中“n”对应的数值就是被更新的文档的数量。

6. findAndModify:先返回结果然后更新。

findAndModify命令中每个键对应的值:

findAndModify:字符串,集合名称。

query:查询文档,用来检索文档的条件。

sort:排序方式,1表示升序,-1表示降序。

update:修改器文档,对找到的文档执行的更新操作。

remove:布尔类型,表示是否删除文档,默认不删除。

new:布尔类型,表示返回更新前的文档还是更新后的文档,默认返回更新前的文档。

Update键和remove键必须有且仅有一个,如果匹配不到文档这个命令会报错。

一次只能处理一个文档,也不能执行upsert操作,只能更新已有文档。

相对普通更新来说,findAndModify速度要慢一些,大概耗时相当于一次查找、一次更新和一次getLastError顺序执行所需的时间。

四、查询

1.一般条件查询:

(_id键总是会被返回,除非显式将其剔除)

查询条件表示符:

$lt(<)、$lte(<=)、$gt(>)、$gte(>=)、$ne(<>)

2. OR查询:

OR查询有两种方式:$in、$or,$in只能对单个键做or查询,如需要对多个键做or查询应该使用$or。$in对应的还有$nin。

3. $mod:将查询的值除以第一个给定值,若余数等于第二个给定值则返回该文档。

4. $not:元条件句,可以用在任何其他条件之上。

5. null值查询:

6. 正则表达式查询:

不区分大小写:db.blog.find({'content':/mongodb/i})

也可以使用$regex操作符来做正则表达式查询:

db.blog.find({'title':{$regex:'lo W'}})

不区分大小写:db.blog.find({'title':{$regex:'lo W',$options:'$i'}})

7. 数组查询:

(1)$all:通过多个元素来匹配数组(元素顺序无关)

(2)$size:根据数组长度查询。

(3)$slice:返回数组元素的一个子集合.

使用$slice将返回文档中所有的键,除非在第二个参数中显式剔除。

(4)查询内嵌文档:

查询整个内嵌文档与普通查询完全相同,但是查询文档的键值对顺序一定要和内嵌文档的键值对顺序一致,否则无法匹配,所以如果

内嵌文档增加或删除了键的话,相对应的查询也要进行更改,比较好的做法是只针对内嵌文档的特定键值进行查询(使用点表示法)。

(5)$elemMatch:将限定条件进行分组,仅当需要对一个内嵌文档的多个键操作时才会用到。

示图中两次查询的区别:

第一次查询,只要comments键对应数组中有两个元素分别满足查询文档中的两个查询条件或同一个元素同时满足这两个条件,

都会返回这个文档;第二次查询,则需要在数组同一个元素中同时满足这两个条件才会返回这个文档。

8. $where查询:可以执行任意JavaScript作为查询的一部分。

如果函数返回true,文档就作为结果的一部分被返回,否则不返回。

使用$where查询时,每个文档都要从BSON转换成JavaScript对象,然后通过$where的表达式来运行,而且还不能利用索引,

所以在速度上要比常规查询慢很多,只有在走投无路时才能考虑$where查询。

可以将常规查询作为前置过滤,与$where组合使用,这样不牺牲性能,也可以使用索引根据非$where子句进行过滤,$where

只用于对结果进行调优。

注意:

  当文档某个键对应值为内嵌文档,需要对其进行完全匹配查询的时候,必须保证查询的值跟文档中的一模一样,连键值对的顺序也要一样才能进行匹配,例如:db.friend.find({'info':{'nick':'yamu','age':30}})和db.friend.find({'info':{'age':30,'nick':'yamu'}})是不一样的,若是friend集合中存在某个文档info键值为{'age':30,'nick':'yamu'},第一个查询是无法匹配到这个文档的,只有第二个查询能匹配。

  对文档中键值为数组的字段进行完全匹配查询的时候也一样,需要保证查询的值跟文档中的一模一样,包括键值对的顺序。与内嵌文档不一样的是,数组字段的查询可以根据某个数组元素的值进行查询而无需指定数组下标,而内嵌文档根据键值进行查询的时候必须指定内嵌文档中的键名。

MongoDB增删改查操作详解(命令行)的更多相关文章

  1. MongoDB增删改查操作详解

    一.插入 MongoDB的插入操作很简单,使用insert方法,这里演示从创建数据库.创建集合到插入文档.查询文档. 集合创建方法参数说明: size:集合最大空间 max:集合最多文档数量 (超出s ...

  2. mongodb增删改查操作

    Note:mongodb存储的是文档,且文档是json格式的对象,所以增删改查都必须是json格式对象. 注:mongodb常用库和表操作,但mongodb在插入数据时,不需要先创建表. show d ...

  3. SSH登录与增删改查demo详解+源代码

    点击下载,测试绝对可用SSH整合框架登录加增删改查demo 下载地址:http://download.csdn.net/detail/qq_33599520/9784679   一.框架概述 spri ...

  4. python3中列表、元组、字典的增删改查说明详解

    python基础中的列表.元组.字典属于python中内置的序列数据结构.其中序列可以进行的操作包括索引.截取(切片).加.乘.成员检查等. 1.列表 列表(list)是最常用的python数据类型之 ...

  5. spring mongodb增删改查操作

    添加数据 School @Id @GeneratedValue private long id; @Indexed(unique = true) private String name; studen ...

  6. 数据库——MongoDB增删改查

    MongoDB增删改查操作 本文包含对数据库.集合以及文档的基本增删改查操作 数据库操作 #1.增 use config #如果数据库不存在,则创建并切换到该数据库,存在则直接切换到指定数据库. #2 ...

  7. SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

    SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...

  8. SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

    SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...

  9. python 全栈开发,Day124(MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器,"$"的奇妙用法,Array Object 的特殊操作,选取跳过排序,客户端操作)

    一.MongoDB初识 什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介 ...

随机推荐

  1. Robotium实践之路源码创建测试项目

    1.JDK安装及环境配置 2.Eclipse安装 3.ADT插件安装 4.模拟器安装 5.准备源码 6.引进源码置项目中 .文件 .导入 .选择现有项目置工作空间中 .浏览 .选择项目,选择模拟器版本 ...

  2. Freemarker入门小案例(生成静态网页的其中一种方式)

    其实生成静态网页的方式有好多种,我昨天看了一下,Freemarker是其中一种,但是Freemarker现在我们都用得比较少了,现在用得ActiveMQ用来发送信息到静态页面,不过想了一下这个小东西, ...

  3. PAT (Basic Level) Practise (中文)-1037. 在霍格沃茨找零钱(20)

    PAT (Basic Level) Practise (中文)-1037. 在霍格沃茨找零钱(20) http://www.patest.cn/contests/pat-b-practise/1037 ...

  4. ios 注册功能研究学习

    通常,移动App的注册功能通常采用手机号码注册或者邮箱帐号注册. 不过在国内这样隐私堪忧的环境下,需要手机号来注册会流失不少用户.即便是新浪微博这样的应用,需要绑定手机号也令我不信任.除非是像淘宝.支 ...

  5. windows下pycharm使用Anaconda安装包环境

    转自: https://www.cnblogs.com/heitaoq/p/8632315.html

  6. HDU-2544-最短路(floyd)

    板子题,实验一下floyd. #include <cstdio> #include <algorithm> #include <cstring> using nam ...

  7. The Three Day

    函数基础-练习 #.写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作 # def modify_file(filename,old,new): # import os # w ...

  8. 【git】不检查特定文件的更改情况

    .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的.正确的做法是在每个clone下来的仓库中手动设置不要检查特定文件的更 ...

  9. python中实现格式化输出 %用法

    当我们在python中需要打印出特定格式的内容时可以用到这个方法,方法介绍如下: 例如我们现在要收集用户的一些个人信息,这时候我们的代码如下: name=input("name: " ...

  10. linux下如何编译运行c程序

    GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C.C++.Ada.Fortran.Objective.Perl.Python.Ruby以及Ja ...