MongoDB数据库的CURD的一些基本语句
from:http://www.data321.com/shujuku/20160514417/addToSetQianMianBuXuYaoJinXing
插入文档:
SQL语句:
INSERT INTO 表名 (列名.......) VALUES(对应的列值.........);
MongoDB语句:
db.集合名.insert({键:值,键:值,键:值.........})
db.集合名.save({键:值,键:值,键:值........})
save()方法和insert()方法的区别在于,save会先判断集合当中是否存在相同的文档,如果存在不执行插入,如果不存在则执行插入。
删除文档:
SQL语句:
DELETE FROM 表名 WHERE 条件
MongoDB语句:
db.集合名.remove({匹配条件})
修改文档:
SQL语句:
UPDATE 表名 SET 列名=值 WHERE 条件
MongoDB语句:
db.表名.update({条件},{要更改的内容},upsert,是否批量修改)
在MongoDB中,update方法有四个参数:
第一个参数:是匹配条件,与SQL语句当中的where条件一样
第二个参数:更新内容,要更改成什么样,写在这里
第三个参数:upsert,如果为true,那集合中有满足第一个条件的文档,就执行更新,如果没有满足第一个条件的文档,就执行插入以条件为内容的新文档,再更新成第二个参数。
第四个参数:如果设为true,则更新所有满足以第一个参数为条件的文档,否则,只更新一条。
好,那么我来给大家说下MongoDB当中常用的修改器:
1.$set 修改器
使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$set':{"name":"捷哥浅谈MongoDB"}},0,1)
这条命令的意思是:将满足name为"捷哥浅谈PHP"的文档的name键更改成"捷哥浅谈MongoDB"
例如:我们原来的文档为:{"name":"捷哥浅谈PHP","age":1,"total":11}
更新以后的文档为:{"name":"捷哥浅谈MongoDB","age":1,"total":11}
如果我们不加$set,直接写成:db.collname.update({"name":"捷哥浅谈PHP"},{"name":"捷哥浅谈MongoDB"},0,1)
大家想想会是什么样的结果?
如果不加$set的话,更新后的文档将会是:
{"name":"捷哥浅谈MongoDB"}
其他的键都会被”干掉“,只留下name键,这显然不是我们想要的结果,所以在update方法中,$set是最常用的修改器。
2.$unset 修改器
说到unset,还记得PHP当中的unset()函数吗,它的功能是删除一个已声明的变量。
同样,在我们的MongoDB当中,$unset是删除文档当中的一个键
使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$unset':{"age":1}},0,1)
更新后的文档:{"name":"捷哥浅谈PHP","total":11}
age键会被删除掉。
3.$inc 增加或减少
使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$inc':{"total":1}},0,1)
意思是让total键自增1,写几就自增几,如果为负数,即为自减
更新后的文档:
{"name":"捷哥浅谈PHP","age":1,"total":12}
童鞋们考虑一下,如果我现在有这样一个微博的文档,内含每个人的评论信息:
- {
- "title":"捷哥浅谈PHP",
- "content":"捷哥浅谈PHP篇篇文章经典",
- "comm":[
- {
- "name":"打酱油的",
- "content":"捷哥太强啦!"
- },
- {
- "name":"赵桐正",
- "content":"这个系列文章太好啦!"
- },
- {
- "name":"李强强",
- "content":"很好的帮助了我"
- }
- ]
- }
如果有一个新的用户“李文凯”,来评论这条微博,内容为:“内容很精彩,千万不要错过哦!”,该怎么样往这条微博里面插入。
这就用到了咱们的数组修改器:
我们来看:
1.$push 修改器
作用:向数组末尾插入一个元素,如果没有就创建一个新的数组
使用方法:db.collname.update({"name":"捷哥浅谈PHP"},{'$push':{"comm":{"name":"李文凯",content:"内容很精彩,千万不要错过哦!"}}})
更新后的文档为:
- {
- "title":"捷哥浅谈PHP",
- "content":"捷哥浅谈PHP篇篇文章经典",
- "comm":[
- {
- "name":"打酱油的",
- "content":"捷哥太强啦!"
- },
- {
- "name":"赵桐正",
- "content":"这个系列文章太好啦!"
- },
- {
- "name":"李强强",
- "content":"很好的帮助了我"
- },
- {
- "name":"李文凯",
- "content":"内容很精彩,千万不要错过哦!"
- }
- ]
- }
童鞋们,如果我现在有这样的需求,如果用户“李文凯”已经评论过此微博,我们就不让其再进行评论,大家思考一下,要怎么做?
我们是否可以通过判断来做,先写一个伪代码,------》如果评论内容中存在要更新的新评论,即name和content的值在评论当中已经存在,我们就不执行更新,否则则更新插入name为“李文凯”的新评论,这样可以有效的防止灌水。
好,我们用代码来实现:
db.collname.update({"name":" 李文凯","comm":{'$ne':{"name":"李文凯","content":"内容很精彩,千万不要错过哦!"}}},{'$push' :{"comm":{"name":"李文凯",content:"内容很精彩,千万不要错过哦!"}}});
这样判断会造成很大的麻烦,我们的$addToSet修改器本身就带有这样的功能,我们来试试:
2.$addToSet修改器
要完成以上需求,我们可以这样来做:
db.collname.update({"name":"李文凯"},{'$addToSet' :{"comm":{"name":"李文凯",content:"内容很精彩,千万不要错过哦!"}}});
大家可以看到,$addToSet前面不需要进行判断,就能达到我们的$ne配合$push完成的效果。
如果我们现在要更改评论里面的name为“李文凯”的评论内容,我们需要使用数组的定位修改器$:
db.collname.update({"comm.name":"李文凯"},{'$set':{"comm.$.content":"我是李小凯"}})
大家再考虑这样一个问题,如果我们的一个用户集合当中,存在一个用户文档,里面有姓名,性别,年龄,爱好(以数组的形式存储)等键,例如:
- {
- "name":"捷哥",
- "sex":"纯爷们",
- "age":27,
- "hobby":[
- "football",
- "basketball",
- "sing"
- ]
- }
我们现在有这样一个需求,在网页当中如果用户勾选了某些爱好的复选框,我们就批量执行插入这些爱好。
有些童鞋会这样想,我们使用$push或者$addToSet直接插入数组就行:
db.user.update({"name":"捷哥"},{'$push':{"hobby":["PHP","JAVA"]}})
大家认为这样可以吗?答案是否定的,执行该条语句后的结果为:
- {
- "name":"捷哥",
- "sex":"纯爷们",
- "age":27,
- "hobby":[
- "football",
- "basketball",
- "sing",
- [
- "PHP",
- "JAVA"
- ]
- ]
- }
这显然不是我们想要的结果,这样就需要我们使用$each来配合$addToSet来使用。
3.$each
我们来看$each,这里我们这样来实现:
db.user.update({"name":"捷哥"},{'$addToSet':{"hobby":{'$each':["PHP","JAVA"]}}})
这样我们更新后的文档为:
- {
- "name":"捷哥",
- "sex":"纯爷们",
- "age":27,
- "hobby":[
- "football",
- "basketball",
- "sing",
- "PHP",
- "JAVA"
- ]
- }
正如童鞋们所见,这样的结果才是我们想要的结果。
注意:$each不能使用$push配合使用,只能使用$addToSet。
4.$pop 修改器
作用:删除数组的第一个元素或者最后一个元素
使用方法:db.user.update({"name":"捷哥"},{'$pop':{"hobby":1}});
修改后的文档就会变成:
- {
- "name":"捷哥",
- "sex":"纯爷们",
- "age":27,
- "hobby":[
- "football",
- "basketball",
- "sing",
- "PHP"
- ]
- }
“1”表示从数组末尾删除一个元素,“-1”表示从数组开头删除一个元素,因此,
db.user.update({"name":"捷哥"},{'$pop':{"hobby":-1}});
运行后的文档更新为:
- {
- "name":"捷哥",
- "sex":"纯爷们",
- "age":27,
- "hobby":[
- "basketball",
- "sing",
- "PHP",
- "JAVA"
- ]
- }
那如果我们现在要删除爱好里面的“sing”,这个元素既不是开头第一个元素,也不是末尾的最后一个元素,显然我们使用$pop已经满足不了这个需求了,这时我们就需要使用$pull修改器了。
5.$pull 修改器
作用:删除数组当中的指定元素
使用方法:db.user.update({"name":"捷哥"},{'$pull':{"hobby":"sing"}})
以上文档修改以后的文档就会变成:
- {
- "name":"捷哥",
- "sex":"纯爷们",
- "age":27,
- "hobby":[
- "basketball",
- "PHP",
- "JAVA"
- ]
- }
由此可见,$pull可以删除数组中的指定的元素,也就是说我们可以任意删除指定的爱好兴趣。
好了,今天把我们常用的修改器都给大家讲了一下,不知道大家都能看明白吗,有问题的话可以跟帖回复提问,也可以给我发邮件lijie@lampbrother.net
MongoDB数据库的CURD的一些基本语句的更多相关文章
- [原创]实现MongoDB数据库审计SQL语句的脚本
功能:实现具体显示mongodb数据库表操作语句的状态和情况,使用awk和shell实现抓取和分析处理.脚本内容如下: #!/bin/bash if [ $# == 0 ];then echo &qu ...
- FineReport如何连接和使用MongoDB数据库
随着NoSQL数据库越来越流行,MongoDB数据库作为NoSQL数据库中的领头羊,使用也越来越广泛.为此,FineReport V8.0版本提供了数据连接和数据集接口,可以通过开发一款可以连接和使用 ...
- python操作mongodb数据库
一.MongoDB 数据库操作 连接数据库 import pymongo conn = pymongo.Connection() # 连接本机数据库 conn = pymongo.Connection ...
- 基于C#的MongoDB数据库开发应用(1)--MongoDB数据库的基础知识和使用
在花了不少时间研究学习了MongoDB数据库的相关知识,以及利用C#对MongoDB数据库的封装.测试应用后,决定花一些时间来总结一下最近的研究心得,把这个数据库的应用单独作为一个系列来介绍,希望从各 ...
- MongoDB数据库简介及安装
一.MongoDB数据库简介 简介 MongoDB是一个高性能,开源,无模式的,基于分布式文件存储的文档型数据库,由C++语言编写,其名称来源取自"humongous",是一种开源 ...
- 浅析MongoDB数据库的海量数据存储应用
[摘要]当今已进入大数据时代,特别是大规模互联网web2.0应用不断发展及云计算所需要的海量存储和海量计算发展,传统的关系型数据库已无法满足这方面的需求.随着NoSQL数据库的不断发展和成熟,可以较好 ...
- MongoDB (五) MongoDB 数据库操作
一.MongoDB创建数据库: use 命令 MongoDB use DATABASE_NAME 用于创建数据库.该命令将创建一个新的数据库,如果它不存在,否则将返回现有的数据库. 语法: use D ...
- 如何将Log4Net 日志保存到mongodb数据库之实践
log4net的大名早有耳闻,一直没真正用过,这次开发APP项目准备在服务端使用log4net. 日志的数据量较大,频繁的写数据库容易影响系统整体性能,所以独立将日志写到mongodb数据库是不错的选 ...
- NodeJS连接MongoDB数据库时报错
今天第一次尝试连接MongoDB数据库,具体步骤也很简单. 首先,通过NodeJS运行环境安装MongoDB包,进入要安装的目录,执行语句 npm install mongodb 安装成功后,通过如下 ...
随机推荐
- AngularJS 脏检查深入分析
写在开头 关于Angular脏检查,之前没有仔细学习,只是旁听道说,Angular 会定时的进行周期性数据检查,将前台和后台数据进行比较,所以非常损耗性能. 这是大错而特错的.我甚至在新浪前端面试的时 ...
- [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一)
[入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一) Date 周二 06 一月 2015 By 钟谢伟 Tags mvc4 / asp.net 示 ...
- 2.EF中 Code-First 方式的数据库迁移
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...
- 初识Hadoop
第一部分: 初识Hadoop 一. 谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...
- GJM: 设计模式 - 观察者模式
GJM : 观察者模式 视频地址: http://www.imooc.com/learn/415 本课程通过一个天气预报的发布和订阅案例,来讲解观察者模式在Java项目中的应用.主要包括观察者模式的结 ...
- JavaScript 数据属性和访问器属性
在JavaScript中对象被定义为"无序属性的集合,其属性可以包含基本值.对象或函数."通俗点讲,我们可以把对象理解为一组一组的名值对,其中值可以是数据或函数. 创建自定义对象通 ...
- android 自定义控件——(一)圆角按钮
----------------------------------矩形或圆角类型(源代码下有属性解释)------------------------------------------------ ...
- Python 环境搭建,开发工具,基本语法
python环境 https://www.python.org/downloads/ 现在pthon有两个版本 一个是3.5系列的 , 一个是2.7系列的.建议用3.5版本的 开发工具 PyCharm ...
- Android Studio多渠道打包
本文所讲述的多渠道打包是基于友盟统计实施的. 多渠道打包的步骤: 1.在AndroidManifest.xml里设置动态渠道变量 <meta-data android:name="UM ...
- 使用mac终端生成RSA私钥和公钥文件
89:~ zhangwenquan$ 89:~ zhangwenquan$ openssl OpenSSL> genrsa -out rsa_private_key.pem 1024 Gener ...