MongoDB的增、删、改、查操作(五)
按照我们关系型数据库的思想,一个服务器要想存放数据,首先要有数据库,表,字段,约束,当然了也少不了主键,外键,索引,关系等;
但是在MongoDB的世界里边,我们不用预先的去创建这些信息从而直接来使用各个属性。
数据库(database)
a)、创建
use mydb(创建并切换到名称为mydb的数据库实例下。注:如果你对其不进行任何操作,该数据库是没有任何实际意义的)
集合(collection)
a)、创建
我们直接指定,不做任何预处理,指定一个名称为users的数据集(相当于表),并向其中插入一条用户数据。
db.users.insert({ "name" : "wjg" , "age" : 24 })
返回结果如下,表示你已经成功插入了一条数据:
WriteResult({ "nInserted" : 1 })
b)、显式创建
仅创建一个名称为collectionName的,没有任何大小和数量限制的数据集
db.createCollection("collectionName")
如果该数据集有重名,会给出已经存在的提示:
{ "ok" : 0, "errmsg" : "collection already exists", "code" : 48 }
成功之后会给出ok的提示:
{ "ok" : 1 }
文档
1.insert()
使用insert或save方法想目标集合插入一个文档:
db.person.insert({"name":"ryan","age":30});
使用insert方法实现批量插入,它与insert方法非常类似,只是它接受的是一个文档数组作为参数。一次发送数十,数百乃至数千个文档会明显提高插入的速度。
db.person.insert([{"name":"ryan","age":30},{"name":"pitaya","age":2}]);
如果在批量插入的过程中有一个文档插入失败,那么在这个文档之前的所有文档都会成功插入到集合中,而这个文档以及之后的所有文档全部插入失败。如果希望insert忽略错误并且继续执行后续插入,可以使用continueOnError选项。shell并不支持这个选项,但所有的驱动程序都支持。
2.update()
使用update方法来更新集合中的数据。update有四个参数,前两个参数是必须的。
db.person.update({"name":"ryan"},{"age":35},true,true);
第一个参数:查询文档,用于定位需要更新的目标文档。
第二个参数:修改器文档,用于说明要对找到的文档进行哪些修改。
第三个参数:true表示要使用upsert,即如果没有找到符合更新条件的文档,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新。
第四个参数:true表示符合条件的所有文档,都要执行更新。
注意:此时的update会用新的文档内容{"age":35}替换掉整个文档去进行update操作,是覆盖式的更新。同时db.person.update({"name":"ryan"},{"age":35})操作也只会更新查询到的第一条符合条件的数据。
修改器:
$set:用来指定一个字段的值。如果这个字段不存在,则创建它。对于更新而言,对符合更新条件的文档,修改执行的字段,不需要全部覆盖。
db.person.update({"name":"ryan"},{"$set":{"age":35}},true,true);
$inc:用来增加已有键的值,或者该键不存在就创建一个。对于投票等有变化数值的场景,这个会非常方便。
db.person.update({"name":"ryan"},{"$inc":{"age":2}},true,true);//对符合name等于ryan的文档,age字段加2。
$push:向已有数组末尾加入一个元素。
db.person.update({"name":"ryan"},{"$set":{"language":["chinese"]}},true,true);//对符合name等于ryan的文档,添加一个language的数组。
db.person.update({"name":"ryan"},{"$push":{"language":"english"}},true,true);//给数组的末尾添加一个值。
$addToSet:避免向数组插入重复的值。
db.person.update({"name":"ryan"},{"$addToSet":{"language":"english"}},true,true); //遇到相同的元素则不会再继续进行插入。
$each:与$push和$addToSet结合,一次给数组添加多个值。
db.person.update({"name":"ryan"},{"$push":{"language":{"$each":["Japanese","Portuguese"]}}},true,true); //如果去掉each则会把数组作为一个数组元素添加进数组。
db.person.update({"name":"ryan"},{"$addToSet":{"language":{"$each":["Japanese","Portuguese"]}}},true,true);
$pop:可以从数组的任何一端删除元素。
db.person.update({"name":"ryan"},{"$pop":{"language":1}},true,true);//从数组的末尾删除一个元素
db.person.update({"name":"ryan"},{"$pop":{"language":-1}},true,true);//从数组的头部删除一个元素
$pull:删除数组对应的值。全部删除。
db.person.update({"name":"ryan"},{"$pull":{"language":"english"}},true,true);
3.remove()/drop()
使用remove方法删除集合中的数据。它可以接受一个查询文档作为可选参数。给定这个参数以后,只有符合条件的文档才能被删除。(删除数据是永久性的,不能撤销,也不能恢复)。
db.person.remove({"name":"ryan"});//删除person集合中name字段的值等于ryan的所有文档。
db.person.remove();//删除person集合中所有的文档。
使用drop方法代替remove方法,可以大幅度提高删除数据的速度。但是这个方法不能指定任何限定条件。而且整个集合都会被删除,包括索引等信息,甚用!!
db.person.drop();
4.find():
MongoDB中使用find方法来进行查询。查询就是返回一个集合中文档的子集,子集的范围从0个文档到整个集合。find方法接受两个参数。
第一个参数决定了要返回哪些文档,参数的内容是查询的条件。
第二个参数来指定想要的键(字段)。第二个参数存在的情况:键的值为1代表要显示,为0代表不显示。“_id”默认显示,其他默认不显示。第二个参数不存在的情况:所有字段默认显示。
db.person.find({"name":"ryan"},{"name":1});
查询条件:
$lt、$lte、$gt、$gte:这四个,就是全部的比较操作符(没有$eq这个操作符),分别对应<、<=、>、>=。
db.person.find({"age":{"$lt":10}}); //年龄小于10的
db.person.find({"age":{"$lt":10,"$gte":5}}); //年龄大于或等于5并且小于10的
这里提供一段小脚本,插入10万条数据,做之后的测试用。(直接支持类似JavaScript的脚本)
for(var i=0;i<100000;i++){
db.person.insert({"name":"ryan"+i,"age":i});
}
$in、$nin:用来查询一个键的多个值。
db.person.find({"age":{"$in":[1,3]}});//查询age等于1或3的文档。
db.person.find({"age":{"$nin":[1,3]}});//查询age不等于1或3的文档。
$or:用来查询多个键的多个值。可以和$in等配合使用。
db.person.find({"$or":[{"name":"ryan2"},{"age":3}]});//查询name等于ryan2或者age等于3的文档。
$exists:查询的键对应是值是null的,默认会返回null和键不存在的文档。可以通过$exists来判断该键是否存在。
db.person.find({"age":{"$in":[null],"$exists":true}});//查询age等于null,并且键是存在的文档。
$where:用它可以在查询中执行任意的javascript,这样就能在查询中做(几乎)任何事情。为了安全起见,应该严格限制或者消除"$where"语句的使用。
db.person.find({"$where":function(){
...;//这里可以是任意的javascript语句。
}})
游标:利用游标可以限制结果的数量,略过部分结果,根据任意键按任意顺序的组合对结果进行各种排序,或者是执行其他的一些强大的操作。
var cursor = db.person.find();
while(cursor.hasNext()){
obj = cursor.next();
...;//这里可以做任何事情。
}
常用的shell:
limit:只返回前面多少个结果。
db.person.find().limit(2);//查询符合条件的文档,显示前两个文档。
skip:跳过多少个结果后显示剩余的。
db.person.find().skip(2);//查询符合条件的文档,显示跳过2个文档后剩余的所有文档。
sort:用于排序。接受一个对象(一组键值对)作为参数,键对应文档的键名,值代表排序的方向。排序的方向可以是1(升序)或者-1(降序)。如果指定了多个键,则按照这些键被指定的顺序逐个排序。
db.person.find().sort({"name":1,"age":-1});//查询的结果,按照name升序,age降序来排序显示。
MongoDB的增、删、改、查操作(五)的更多相关文章
- 怎样从C#中打开数据库并进行 增 删 改 查 操作
首先 在C#中引用数据库的操作! (因为我们用的是SQLserver数据库,所以是SqlClient) using System.Data.SqlClient; 1:要实现对数据库的操作,我们必须先登 ...
- 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- iOS sqlite3 的基本使用(增 删 改 查)
iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...
- django ajax增 删 改 查
具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...
- iOS FMDB的使用(增,删,改,查,sqlite存取图片)
iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...
- ADO.NET 增 删 改 查
ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...
- MVC EF 增 删 改 查
using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...
- MongoDB增 删 改 查
增 增加单篇文档 > db.stu.insert({sn:'001', name:'lisi'}) WriteResult({ "nInserted" : 1 }) > ...
- python基础中的四大天王-增-删-改-查
列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...
- Java操作MongoDB:连接&增&删&改&查
1.连接 ①方式一 MongoClientOptions.Builder builder = MongoClientOptions.builder(); //可以通过builder做各种详细配置 Mo ...
随机推荐
- sql中case when语句的使用
case when语句有两种格式:简单case函数和搜索case函数. --简单Case函数CASE sexWHEN '1' THEN '男'WHEN '2' THEN '女'ELSE '其他' EN ...
- 八皇后问题-dfs
一.题意解析 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线.竖线.斜线方向上?八皇后问题是一个古老的问题,于1848年由一位国际象 ...
- Real Time Render 4
[Real Time Render 4] 1.Radiometry(辐射测试) deals with the measurement of electromagnetic(电磁) radiation( ...
- pecan API调用
1.在PasteDeploy部署caesar-api服务时,setup_app中建立app,app中设置hooks,hooks负责加载conf配置文件和数据库连接 self.storage_conne ...
- msf客户端渗透(十):社会工程学
启动社会工程学攻击组件 生成二维码攻击模块 输入你想生成二维码的url,这里做演示用www.baidu.com 二维码生成后,在这个路径下 生成u盘,DVD的多媒体攻击载荷 通过修改autorun.i ...
- web漏洞详解及修复建议
1.漏洞描述 跨站脚本攻击(Cross-site scripting,通常简称为XSS)发生在客户端,可被用于进行窃取隐私.钓鱼欺骗.偷取密码.传播恶意代码等攻击行为. 恶意的攻击者将对客户端有危害的 ...
- Python Flask Jinja2模板引擎
模板 简介 模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请 求的上下文中才能知道. 渲染 使用真实值替换变量,再返回最终得到的响应字符串,这一过程 称为渲染.为了渲染模 ...
- 【C++】STL算法之remove_if
之前写过这样一段代码: auto iter=remove_if(AllEdges.begin(),AllEdges.end(),[&](Edge* edge){return _isEedge( ...
- Mybatis学习链接
mybatis实战教程(mybatis in action),mybatis入门到精通 http://blog.csdn.net/techbirds_bao/article/details/923 ...
- js增减日期
参考 https://www.cnblogs.com/gmq-sh/p/5194706.html date.setDate(date.getDate() + 3);