当前位置: 首页 > news >正文

mongodb基本操作及使用

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

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引​​​​​​​

创建数据库

use articledb

创建集合

db.createCollection("my")

查询集合

show collections

删除集合

db.集合.drop()

db.my.drop()

集合的增删改查

1.单个插入,比如我这里向comment放入一条评论表数据

db.comment.insert({
    "articleid":"10000","content":"今天天气真好啊,阳光明媚","userid":"1001",
"nickename":"rose","createdatetime":new Date(),
"likenum":NumberInt(10),"state":null
})

2.查询

db.comment.find()

3.插入多个  insertMany()

db.comment.insertMany([{
    "articleid":"10001","content":"今天大雾,雾蒙蒙的","userid":"1002",
"nickename":"rose","createdatetime":new Date(),
"likenum":NumberInt(10),"state":null
},{
    "articleid":"10002","content":"今天天气真冷,冻死宝宝了","userid":"1003",
"nickename":"rose","createdatetime":new Date(),
"likenum":NumberInt(10),"state":null
}])

4.条件查询

db.coment.find(),通过查询方法里面放入json格式的参数,进行条件查询,比如查询userid为1003的评论

db.comment.find({"userid":"1003"})

5.投影查询 ,如果只需要查出表部分字段

db.comment.find({"userid":"1003"},{userid:1,nickename:1,_id:0})

5 批量插入的时候并不会因为某一条的失败而回滚,所以需要tryCatch

文档的更新

文档的更新语法 db.collection.update(query,update,options)

覆盖的修改

db.comment.update({userid:"1001"},{likenum:NumberInt(100)})

执行后我们发现,这条文档除了likenum这个字段,其他的都不见了

 局部修改

为了解决这个问题。我们需要使用修改器$set 

db.comment.update({userid:"1002"},{$set:{likenum:NumberInt(100)}})

文档的删除

文档的删除语法

db.集合名称.remove(条件)

db.comment.remove({_id:ObjectId("6311b7305e41940620ddd71d")});

分页查询

查询总数

db.comment.count({userid:"1002"})

分页查询,mongdb提供一个skip()

db.comment.find().limit(2).skip(3);

排序查询

sort()方法对数据进行排序,sort方法,可以通过参数指定排序的字段,并使用1和-1指定升序和降序

db.comment.find().sort({likenum:-1})

比较查询

< ,<= ,>,>= 这些操作符也是很常用 

db.集合名称.find({"field":{ $gt:value}}) //大于:field>value

db.集合名称.find({"field":{ $lt:value}}) //小于:field<value

db.集合名称.find({"field":{ $gte:value}}) //大于等于:field>=value

db.集合名称.find({"field":{ $lte:value}}) //小于:field<=value

db.集合名称.find({"field":{ $lte:value}}) //不等于:field !=value

例如查询评论数大于10的记录

db.comment.find({likenum:{$gt:NumberInt(10)}})

包含查询$in操作符

db.comment.find({userid:{$in:["1001","1002","1003"]}})

索引的使用

索引可以提升查询的效率,mongodb支持单字段的索引和复合索引

1.查看索引

db.collection.getIndexes()

{
	"v" : 2,
	"key" : {
		"_id" : 1
	},
	"name" : "_id_",
	"ns" : "articledb.comment"
}

v 表示字段的版本号码

创建索引

1.在集合上创建索引

语法

db.collection.createIndex(keys,options)

db.comment.createIndex({userid:1})

2.复合索引:对于userid和nickname 同时建立符合(Compound)索引

db.comment.createIndex({userid:1,nickname:-1})

索引的移除

db.comment.dropIndex({userid:1})

查看执行计划 调用explain()

db.comment.find({userid:"1003"}).explain()

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "articledb.comment",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"userid" : {
				"$eq" : "1003"
			}
		},
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"userid" : 1
				},
				"indexName" : "userid_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"userid" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"userid" : [ "[\"1003\", \"1003\"]" ]
				}
			}
		},
		"rejectedPlans" : [
			{
				"stage" : "FETCH",
				"inputStage" : {
					"stage" : "IXSCAN",
					"keyPattern" : {
						"userid" : 1,
						"nickname" : -1
					},
					"indexName" : "userid_1_nickname_-1",
					"isMultiKey" : false,
					"multiKeyPaths" : {
						"userid" : [ ],
						"nickname" : [ ]
					},
					"isUnique" : false,
					"isSparse" : false,
					"isPartial" : false,
					"indexVersion" : 2,
					"direction" : "forward",
					"indexBounds" : {
						"userid" : [ "[\"1003\", \"1003\"]" ],
						"nickname" : [ "[MaxKey, MinKey]" ]
					}
				}
			}
		]
	},
	"serverInfo" : {
		"host" : "appledeMacBook-Pro.local",
		"port" : 27017,
		"version" : "4.0.10",
		"gitVersion" : "c389e7f69f637f7a1ac3cc9fae843b635f20b766"
	},
	"ok" : 1
}

从winningplan的stage为FETCH 就表示命中的索引

相关文章:

  • jQuery中的函数
  • leetcode:188. 买卖股票的最佳时机IV
  • 电脑技巧:Win7、Win10、Win11如何选择,看完你就懂了
  • 【初阶数据结构】堆排序和TopK问题
  • 筑梦远航 势不可挡|和数研究院四周岁啦
  • 广东2022年上半年系统集成项目管理工程师下午真题及答案解析
  • 【论文解读系列】NER方向:LatticeLSTM (ACL2018)
  • java毕业设计成品源码网站基于JSP的网上订餐管理系统|餐饮就餐订餐餐厅
  • Jenkins更新版本和插件导致maven工程job丢失(不显示)或部分功能丧失(svn,ssh)
  • 计算机网络——传输层の选择题整理
  • 多级缓存的原理和实现
  • hadoop学习使用
  • 【WSL2】CENTOS7 安装与配置
  • Python调用OpenCV接口播放本地视频文件、本地和网络摄像头
  • 推进智慧工地建设,智慧工地是什么?建筑工地人必看!
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • HTML中设置input等文本框为不可操作
  • Java多线程(4):使用线程池执行定时任务
  • Laravel Mix运行时关于es2015报错解决方案
  • Material Design
  • MySQL的数据类型
  • react 代码优化(一) ——事件处理
  • vue:响应原理
  • 大快搜索数据爬虫技术实例安装教学篇
  • 讲清楚之javascript作用域
  • 通过几道题目学习二叉搜索树
  • 移动端解决方案学习记录
  • hi-nginx-1.3.4编译安装
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​【已解决】npm install​卡主不动的情况
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $NOIp2018$劝退记
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (vue)页面文件上传获取:action地址
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (一)Neo4j下载安装以及初次使用
  • .NET 8.0 中有哪些新的变化?
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .netcore如何运行环境安装到Linux服务器
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @javax.ws.rs Webservice注解
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [20150904]exp slow.txt
  • [20171102]视图v$session中process字段含义
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)