目录
安装
官网下载地址:官网下载地址: MongoDB Community Download | MongoDB
我下载的一个windows版本的zip文件
解压后
在该目录下新增两个文件夹和一个文件:data logs mongo.config
在data文件夹下新增 db文件夹
在logs文件夹下新增 mongo.log文件
在mongo.config中配置如下内容(自行修改自己的安装地址):
dbpath=D:\setup-util\mongodb-win32-x86_64-windows-5.0.6\data\db #数据库路径
logpath=D:\setup-util\mongodb-win32-x86_64-windows-5.0.6\logs\mongo.log #日志输出文件路径
port=27017 #端口号默认为27017
接下来用管理员身份运行 cmd
cd到安装目录/bin下面,运行命令(自行调整路径):
mongod --dbpath D:\setup-util\mongodb-win32-x86_64-windows-5.0.6\data\db
打开浏览器,访问 http://localhost:27017/
启动就已经完成了,为了方便下次启动,注册服务
mongod --dbpath D:\setup-util\mongodb-win32-x86_64-windows-5.0.6\data\db --logpath D:\setup-util\mongodb-win32-x86_64-windows-5.0.6\logs\mongo.log --install --serviceName "MongoDB"
运行完成打开服务可以找到,尝试重启一下
至此,安装完成
常用操作命令
我没有用原生的命令,还是用工具爽,本文使用navicat for mongoDB
先尝试连接一下数据库:
写个名字就行了
然后新建数据库,新建集合(集合就是mysql的表)
插入数据
insert()
db.collection.insert 插入数据 示例: db.one_demo.insert({aaa:"aaa"})
db.collection.insertOne 插入一条数据 示例: db.one_demo.insertOne({aaa:"aaa"})
db.collection.insertMany 插入多条数据
示例: db.one_demo.insertOne([{aaa:"aaa"},{bbb:"bbb"}])
save()
db.collection.save 同上使用,区别:
save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据
js循环插入
循环插入50条数据,语法就是js的,还可以使用Math等
var tags = ["nosql", "mongodb", "document", "developer", "popular"];
var books = [];
for(var i = 0; i < 50; i++) {
var tagIdx = Math.floor(Math.random() * tags.length);
var favCount = Math.floor(Math.random() * 100);
var book = {
title: "book-" + i,
tag: tags[tagIdx],
favCount: favCount,
author: "xxx" + i
};
books.push(book)
}
db.one_demo.insertMany(books);
查询
db.collection.find(query,projection)
query:可选,使用查询操作符指定查询条件
projection:可选,使用投影操作符指定返回的键。查询时返回文档中所有键值,只需省略该参数即可(默认省略)。投影时,id为1的时候,其他字段必须是1;id是0的时候,其他字段可以是0;如果没有_id字段约束,多个其他字段必须同为0或同为1。
最简单的查询实例: db.one_demo.find()
条件查询:
#查询带有nosql 标签的 book 文档:
db.one_demo.find({tag:"nosql"})
#按照id 查询单个 one_demo 文档:
db.one_demo.find({_id:ObjectId("62343737124d0000e5007fd3")})
#查询分类为“travel” 、收藏数超过 60 个的 one_demo 文档:
db.one_demo.find({type:"travel", favCount:{$gt:60}})
对照表
mysql | mangDB |
a = 1 | {a: 1} |
a <> 1 | {a: {$ne: 1}} |
a > 1 | {a: {$gt: 1}} |
a >= 1 | {a: {$gte: 1}} |
a < 1 | {a: {$lt: 1}} |
a <= 1 | {a: {$lte: 1}} |
a = 1 AND b = 1 | {a: 1, b: 1}或{$and: [{a: 1}, {b: 1}]} |
a = 1 OR b = 1 | {$or: [{a: 1}, {b: 1}]} |
a IS NULL / a IS NOT NULL | {a: {$exists: false}} / {a: {$exists: true}} |
a IN (1, 2, 3) | {a: {$in: [1, 2, 3]} |
含义对比:
$lt:存在并小于
$lte:存在并小于等于
$gt:存在并大于
$gte:存在并大于等于
$ne:不存在或存在但不等于
$in:存在并在指定数组中
$nin:不存在或不在指定数组中
$or:匹配两个或多个条件中的一个
$and:匹配全部条件
模糊查询-正则表达式
//使用正则表达式查找title包含so字符串的
db.two_demo.find({title:{$regex:"so"}}) //或者
db.two_demo.find({title:/book/})
排序和分页
排序
db.one_demo.find().sort({favCount:1}) //1升序 -1降序
分页
查询skip用于指定跳过记录数,limit则用于限定返回结果数量。可以在执行find命令的同时指定skip、limit参数,以此实现分页的功能。
比如,假定每页大小为10条,查询第3页:
db.two_demo.find().skip(20).limit(10)
db.two_demo.find().limit(10).skip(20) //都一样
更新数据
操作符 | 格式 | 描述 |
$set | {$set:{field:value}} | 指定一个键并更新值,若键不存在则创建 |
$unset | {$unset : {field : 1 }} | 删除一个键 |
$inc | {$inc : {field : value } } | 对数值类型进行增减 |
$rename | {$rename : {old_field_name :new_field_name } } | 修改字段名称 |
$push | { $push : {field : value } } | 将数值追加到数组中,若数组不存在则会进行初始化 |
$pushAll | {$pushAll : {field : value_array }} | 追加多个值到一个数组字段内 |
$pull | {$pull : {field : _value } } | 从数组中删除指定的元素 |
$addToSet | {$addToSet : {field : value } } | 添加元素到数组中,具有排重功能 |
$pop | {$pop : {field : 1 }} | 删除数组的第一个或最后一个元素 |
更新单个示例
db.one_demo.update({_id:ObjectId("62343737124d0000e5007fc8")},{$inc:{favCount:1}}) #修改id 62343737124d0000e5007fc8 的favCount 字段加一
更新多个示例
db.one_demo.update({favCount:{$gte: 90}},{$inc:{favCount:1}}) //这个只会更新一条
默认情况下,update命令只在更新第一个文档之后返回,如果需要更新多个文档,则可以使用multi选项。
db.one_demo.update({favCount:{$gte: 90}},{$inc:{favCount:1}},{"multi":true})
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
db.one_demo.update({title:"没有名字"},{$set:{favCount:1}},{upsert:true})
findAndModify 查询更新
根据输入的选择条件修改并返回单个文档。 默认情况下,返回的文档不显示更新的内容。
用来保证操作的原子性
示例:
db.one_demo.findAndModify({
query:{_id:ObjectId("623447d22cb383d2207935f9")},
update:{title:"查询并更新"}
})
删除数据
remove()
db.one_demo.remove({favCount:28})//删除favCount等于28的记录
db.one_demo.remove({favCount:{$lt:25}})//删除favCount小于25的记录
db.one_demo.remove({})//删除所有记录
db.one_demo.remove()//报错
db.one_demo.remove({title:"book"},true) //删除满足条件的一条数据,默认是false全部
delete()
官方推荐使用deleteOne()和deleteMany()方法删除数据(文档),语法格式如下:
db.books.deleteMany({})//删除集合下全部文档
db.books.deleteMany({title:"novel"})//删除title等于novel的全部文档
db.books.deleteOne({title:"novel"})//删除title等于novel的一个文档
注意:remove、deleteMany等命令需要对查询范围内的文档逐个删除,
如果希望删除整个集合,则使用drop命令会更加高效 db.one_demo.drop()
关于mongodb的基础增删改查就记录到这儿,方便查阅,后续如果实际工作需要使用高级的,再做记录