`
风过无声
  • 浏览: 92650 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

MongoDB CURD

 
阅读更多

1.shell基本操作

shell是一个功能完备的JavaScript解释器,可以运行任何JavaScript程序。

通过mongo.exe运行MongoDB shell后,shell会连到MongoDB服务器的test服务器,并将这个数据库连接赋值给全局变量db。

切换数据库

use DB_NAME

查看帮助文档

help

 2.数据库的创建和删除

通过切换数据库的命令来创建数据库,不过此时该数据库尚未真正创建起来,只有当数据库中创建了集合后,该数据才会真正建立起来。

use micromsg

 此时使用查看数据库的命令是看不到micromsg的

show dbs

 删除当前数据库

db.dropDatabase();

 3.集合的创建和删除

1)通过函数创建

db.createCollection(name, { size : ..., capped : ..., max : ... } );
e.g.
db.createCollection("user");

2)通过直接往不存在的集合里添加文档创建,此时MongoDB会自动创建该集合

var user = { "id": "100100100", "nickname": "路人甲" };
db.user.insert(user);

 3)删除集合

db.collections.drop();
e.g.
db.user.drop();

 4.文档的插入,读取,删除,更新

 1)插入,文档大小不能超过4MB

db.collectios.insert(obj);
e.g.
var user = { "id": "100100100", "nickname": "路人甲" };
db.user.insert(user);

 可以通过JS代码插入

for (var i = 0; i < 10; i++) {
	var user = { "id": 100100100 + i + "", "nickname": "路人甲" + i };
	db.user.insert(user);
}

批量插入:传递一个由文档构成的数组给数据库。

一次批量插入只是单个的TCP请求,避免了许多零碎请求所带来的开销;加上无需处理大量的消息头,批量插入会快一些。

注:批量插入的数量受限于Mongo消息的长度,目前为16MB。 

var users = [];
for (var i = 0; i < 10; i++) {
	var user = { "id": 100100100 + i + "", "nickname": "路人甲" + i };
	users[i] = user;
}
db.user.insert(users);

插入的原理

驱动程序将数据装换为BSON的形式,然后将其送入数据库。数据库解析BSON,检验是否包含"_id"键并且文档不能超过4MB,除此之外,不做别的数据验证,就只是简单地将文档原样存入数据库中。

可以使用--objcheck选项使服务器在插入之前检查文档结构的有效性。

 2)读取

这里进介绍简单的两个读取方式

--返回集合里面所有的文档

db.collectios.find();
e.g.
db.user.find();

 --返回集合里的第一个文档

db.collection.findOne();
e.g.
db.user.findOne();

3)删除

db.collectios.remove(query)

 query为查询文档,只有符合条件的文档才被删除

//删除"nickname"="路人甲0"的文档
db.user.remove({ "nickname": "路人甲0" });
//删除所有的文档
db.user.remove();

 删除数据是永久性的,不能撤销,也不能恢复。

4)更新

更新操作是原子的:若两个更新同时发生,严格按照先后顺序执行。

db.collections.update(query, object[, upsert_bool, multi_bool])

query:查询文档,找出要更新的文档

object:修改器文档,描述对文档做哪些更改

(1)完全替换

db.user.update({"id": "100100100"}, { "id": "100100100", "nickname": "路人甲" });

 (2)$inc

累加修改器,对指定的键进行累加操作。

只能用于数字类型。

键不存在时创建一个键,并将其初始化为0 

//init + add
db.user.update({ "id": "100100110" }, {$inc: {"age": 1}});
//add
db.user.update({ "id": "100100110" }, {$inc: {"age": 1}});
          (3)$set 

用来指定一个键的值,如果这个键不存在,则创建它。 

//add
db.user.update({ "id": "100100109" }, {$set: {"age": 18}});
//update
db.user.update({ "id": "100100110" }, {$set: {"age": 17}});

 还可以用来操作内嵌文档的键 

db.user.update({ "id": "100100110" }, {$set: {"favorite_book": {"name": "三国"}}});
//add
db.user.update({ "id": "100100110" }, {$set: {"favorite_book.author": "罗"}});
//update
db.user.update({ "id": "100100110" }, {$set: {"favorite_book.author": "罗贯中"}});
//add nest doc + key 
db.user.update({ "id": "100100109" }, {$set: {"favorite_book.author": "罗"}});
          (4)$unset

 删除文档中的指定键 

db.user.update({ "id": "100100109" }, {$unset: {"age": 1}});
         同理,也可以用来操作内嵌文档的键
db.user.update({ "id": "100100110" }, {$unset: {"favorite_book.author": 1}});
          (5)$push
向已有的数组的末尾加入一个元素。要是没有就会创建一个数组。
//init + push
db.user.update({ "id": "100100101" }, {$push: {"favorite_books": "三国"}});
//push
db.user.update({ "id": "100100101" }, {$push: {"favorite_books": "三国"}});
//have added 2 elements
可以和$each组合,一次向数组添加多个元素
db.user.update({ "id": "100100101" }, {$push: {"favorite_books": {$each: ["三国", "水浒"]}}});
  (6)$addToSet
 和$push功能一直,但是添加时可以避免重复。
//init + push
db.user.update({ "id": "100100102" }, {$addToSet: {"favorite_books": "三国"}});
//push
db.user.update({ "id": "100100102" }, {$addToSet: {"favorite_books": "三国"}});
//have added only 1 element
 和$each组合起来时,可以添加多个不同的值。
db.user.update({ "id": "100100102" }, {$addToSet: {"favorite_books": {$each: ["三国", "水浒", "西游"]}}});
 (7)$pop
移除数组index位置处的元素,index>0,从尾部开始,index<0从头部开始,index=0和index=1效果一样,值最后一个元素
db.user.update({ "id": "100100102" }, {$addToSet: {"favorite_books": {$each: ["三国", "水浒", "西游", "红楼", "聊斋"]}}});
db.user.update({ "id": "100100102" }, {$pop: {"favorite_books": 0}});
db.user.update({ "id": "100100102" }, {$pop: {"favorite_books": 1}});
db.user.update({ "id": "100100102" }, {$pop: {"favorite_books": -1}});
db.user.update({ "id": "100100102" }, {$pop: {"favorite_books": 6}});
 (8)$pull
基于特定条件来删除元素,而不是紧紧依靠位置
db.user.update({ "id": "100100102" }, {$push: {"favorite_books": {$each: ["三国", "水浒", "西游", "三国", "三国"]}}});
db.user.update({ "id": "100100102" }, {$pull: {"favorite_books": "三国"}});
 (9)数组的定位修改器
--通过数组下标(从0开始)定位元素
db.user.update({ "id": "100100104" }, {$addToSet: {"favorite_books": {$each: ["三国", "水浒", "西游", "红楼", "聊斋"]}}});
db.user.update({ "id": "100100104" }, {$set: {"favorite_books.0": "三国1"}});
 --通过$定位符来定位查询文档已经匹配的元素(只更新第一个匹配的元素)
db.user.update({ "id": "100100105" }, {$push: {"favorite_books": {"name": "三国", author: "罗"}}});
db.user.update({ "id": "100100105" }, {$push: {"favorite_books": {"name": "三国", author: "罗"}}});
//只修改了第一个元素对应的键值
db.user.update({ "favorite_books.author": "罗"}, {$set: {"favorite_books.$.author": "罗贯中"}});
 (10)upsert
一种特殊的更新。要是没有文档符合更新条件,就会以这个条件和更新文档为基础创建一个新文档。
db.user.update({ "id": "100100111" }, {$set: {"nickname" : "路人甲11", "age": 22}}, true);
 (11)save
在文档不存在时插入,存在时更新。
db.collections.save(obj)
 要是该文档有_id键,则调用upsert。否则,会调用插入
// upsert 
db.user.save({
  "_id" : ObjectId("53037ae4564524c4f605e0af"),
  "age" : 24,
  "id" : "100100112",
  "nickname" : "路人甲12"
});
// insert
db.user.save({
  "age" : 24,
  "id" : "100100112",
  "nickname" : "路人甲12"
});
 (12)更新多个文档
默认情况下,更新只能对符合匹配条件的第一个文档进行更改。要是多个文档符合条件,其余的文档就没有变化。当需要更新匹配的所有文档时,需要显式说明。
// update 1 doc
db.user.update({"id" : "100100112"}, {$set: {"age" : 26}});
// update 2 docs
db.user.update({"id" : "100100112"}, {$set: {"age" : 25}}, false, true);
 通过getLastError命令查看更新的文档数 
db.user.update({"id" : "100100112"}, {$set: {"age" : 25}}, false, true);
db.runCommand({getLastError: 1});
 (13)findAndModify命令

相当于 一次find + 一次update/remove + 一次getLastError命令 的原子操作 

db.runCommand({
	"findAndModify": "user",
	"query": {"id" : "100100112"},
	"sort": {"_id": 1},
	"update": {$set: {"nickname": "路人甲"}}
});

命令中每个键的对应值如下所示

findAndModify:集合名

query:查询文档

sort:排序结果的条件

update:修改器文档 / remove:boolean类型,表示是否删除文档 (update和remove必须有且仅有一个)

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

5.瞬间完成

对文档的插入,删除,更新都是瞬间完成的,它们都不等待数据库响应。

不等于异步操作,客户端将文档发送给服务器后就立刻干别的了。

有点:速度快,缺点:可能会丢失数据

6.安全操作

安全操作在执行了操作之后立即运行getLastError命令,来检查是否执行成功。 

驱动程序会等待数据库响应,然后适当地处理错误,一般会抛出一个可被捕获的异常。

7.请求和连接

MongoDB会为每一个数据库连接创建一个队列,存放这个连接的请求。

客户端发送的请求将会被放到队列的末尾,请求严格按照队列的顺序进行执行,因此单个连接总是能读到自己写得东西。

 

注:每个连接都有独立的队列,要是打开两个Shell,就有两个数据库连接。

在一个Shell中插入,之后在另一个Shell中查询不一定能得到插入的文档,可能会存在延时。

分享到:
评论

相关推荐

    mongoDB数据库CURD操作,配有界面

    在这个MongoDB CURD操作的示例中,我们将探讨如何在Windows 7环境下使用MongoDB进行基本的数据操作,并结合Struts2、jQuery和CSS来创建一个具有图形用户界面的Web应用。 首先,CURD是创建(Create)、读取(Retrieve)...

    MongoDB的CURD实例附带C#官方驱动集

    CURD操作是数据库中最基本的操作,代表了创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)数据的过程。在MongoDB中,这些操作通过其丰富的API来实现,而C#作为广泛使用的编程语言,也有专门的官方驱动...

    mongoDB-CURD操作-----JAVA

    在Java开发中,与MongoDB的交互通常通过Java驱动程序实现,它提供了对数据库的基本CURD(创建、读取、更新、删除)操作的支持。本篇文章将深入探讨MongoDB在Java环境下的CURD操作,帮助初学者更好地理解和应用。 ...

    MongoDB-manual-中文版(待续)

    ### MongoDB CURD 操作详解 #### 一、概述 MongoDB 是一款开源的NoSQL数据库系统,它使用JSON-like的文档来存储数据,并且能够自动地分片存储大量的数据集,支持水平扩展。MongoDB 以其灵活性、高性能、易于部署等...

    [nodejs,mongodb,angularjs2]我的便利贴

    纯mongodb CURD操作: http://127.0.0.1:3000/mongodb/ 便利贴应用:http://127.0.0.1:3000/ 4.运行方法: 1) 安装有nodejs,mongodb 2) npm install supervisor -g 3) npm install 4) npm start

    ThinkJS中如何使用MongoDB的CURD操作

    在ThinkJS框架中,MongoDB的CURD操作是通过模型(Model)进行的,这使得开发者能够在JavaScript环境中方便地处理数据库的增删查改任务。尽管ThinkJS官方文档主要以MySQL为例,但其对MongoDB的支持同样强大,只是需要...

    mongodb_demo:SpringBoot整合mongoDB完成CURD

    本项目“mongodb_demo”正是一个实例,演示了如何在Spring Boot应用中整合MongoDB来实现 CURD(创建、读取、更新和删除)操作。 首先,我们需要在Spring Boot项目中添加MongoDB的相关依赖。这通常通过在`pom.xml`或...

    mongoDB DAO层封装

    Spring Data对MongoDB的支持体现在Spring Data MongoDB模块中,它允许开发者通过Java的Repository接口进行CURD操作,无需编写SQL或MongoDB的查询语句。只需定义Repository接口,Spring Data会自动生成实现,自动...

    mongodb数据库入门之CURD简单操作示例

    本文将深入介绍MongoDB数据库的基础操作,包括CURD(Create、Update、Read、Delete)操作,这对于理解MongoDB的基本工作原理至关重要。 首先,我们来看如何创建和使用数据库。在MongoDB中,数据库是通过`use`命令来...

    为数据库创建容器:docker组成创建数据库容器:用于本地开发的Mysql,Postgres,Mongodb,ElasticSearch,Dynamodb

    为数据库创建容器docker组成创建数据库容器:用于本地开发的Mysql,Postgres,Mongodb,ElasticSearch,Dynamodb

    真实可用的mongodb下周地址.txt

    04-CURD操作详解 04-mongodb操作3 05-回顾 05-深入查询表达式 06-索引的使用 06-游标操作 07-固定集合 07-索引 08-备份与恢复 08-用户管理 09-mongoDB备份与恢复 09-安全和认证 10-replication复制集 ...

    mongodb 的 小例子(curd)

    群里学习lucene的成员挺多的,一直没时间给大家做个demo、最近抽时间用lucene给大家写了个demo 可以配置采集网站的图片,包含分组统计,相同数据合并功能,主要是给群内成员来个demo 小试牛刀、临时写的,莫吐槽 ...

    node-Mongodb-CURD-:node+Mongodb增删该查小栗子

    本教程“node-Mongodb-CURD-:node+Mongodb增删改查小栗子”主要涉及如何使用Node.js和Mongoose进行MongoDB的基本CRUD(创建Create、读取Read、更新Update、删除Delete)操作。下面将详细介绍这些操作: 1. 创建...

    所有使用数据库的Web应用都\"just CURD Apps(只是CURD应用)

    数据库系统如MySQL、PostgreSQL、MongoDB等提供了API和查询语言(如SQL)来支持这些操作。例如,SQL中的`INSERT INTO`用于创建新记录,`SELECT`用于读取,`UPDATE`用于修改,`DELETE FROM`用于删除。在Web应用中,...

    Mongodb 数据类型及Mongoose常用CURD

    **Mongoose 常用 CURD 操作**: 1. **连接数据库** - 使用 `mongoose.connect('mongodb://localhost/test')` 连接到 MongoDB 实例。 2. **定义模式(Schema)** - 如 `var TodoSchema = new Schema({ title: String...

    CURD-MongoDB-NodeJS-Express:CURD操作使用MongoDB,Express,Nodejs和Handlebas执行

    本项目“CURD-MongoDB-NodeJS-Express”是一个使用JavaScript语言,结合MongoDB数据库、Express框架以及Node.js后端服务器环境来实现这些基本操作的实例。下面我们将深入探讨这些技术及其相互作用。 首先,MongoDB...

    MongoDB入门指南

    《MongoDB入门指南》是一个快速入门MongoDB的教程,它以MongoDB的3.0版本进行说明。本教程安装的是MongoDB ...本教程是基础入门级别的,只包含MongoDB非常基础的CURD操作和基本概念,适合第一次接触MongoDB的人员阅读。

    使用MyBatisPlus的方式,优雅的操作MongoDB,可和现有Mongo框架结合使用,无侵入性

    使用MyBatisPlus的方式,优雅的操作MongoDB,可和现有Mongo框架结合使用,无侵入性 简化开发, 只需简单配置,即可快速进行CRUD操作,链式调用更加便捷。只做增强不做改变,引入它不会对现有工程产生影响,如丝般...

Global site tag (gtag.js) - Google Analytics