MongoDB简介
- 为快捷开发而设计的数据库
- 设计目标是极简、灵活,避免oracle数据库会有字段类型等限制
- 数据模型是面向文档,所谓文档是类似JSON的数据
MongoDB下载及安装
- 对32位支持不好,建议安装64位系统
- 偶数版本是稳定版,奇数版是开发版,建议下载偶数版本
- 默认点击next安装
启动数据库
- 配置环境变量,找mongo安装路径的bin目录,将路径添加到path中,打开命令行输入:mongod验证是否配置完成
- 创建数据库目录:存储数据库文件
- 启动数据库,cmd输入:mongod 已打开的窗口不可关闭
- 再次打开cmd窗口,输入 mongo 链接mongodb,出现 >
变量配置
- 文件位置设置:mongod --dbpath 数据库路径
- 端口设置:默认是27017 修改:–port 10086 (建议4位以上,避免和系统端口冲突)
数据库
- 数据库的服务器:保存数据 命令:mongod
- 数据库的客户端:操作数据 命令:mongo
配置开机自启
省略
基本概念
概念 | 解释 |
---|---|
数据库 | database数据库是仓库,仓库可以存放集合,数据库服务器可以有多个数据库 |
集合 | collection集合类似数组,集合可以存放文档 |
文档 | document |
基本指令
操作 | 命令 |
---|---|
查看数据库 | show databases |
进入数据库 | use 数据库名 |
显示当前数据库 | db |
显示集合 | show collection |
MongoDB的CROD
插入
db..insert(doc)
数据库.集合名.insert(文档)
查询
db..find()
数据库.集合.find()
安装图形化操作界面
F6执行光标所在行的sql
数据库操作
- insert
- query
举栗子
{ status: { $in: [ "A", "D" ] } }
SELECT * FROM inventory WHERE status in ("A", "D")
{ status: "A", qty: { $lt: 30 } }
SELECT * FROM inventory WHERE status = "A" AND qty < 30
{ $or: [ { status: "A" }, { qty: { $lt: 30 } } ] }
SELECT * FROM inventory WHERE status = "A" OR qty < 30
{ status: "A", $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ] }
SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
Match an Array
按指定顺序查询字段标记值为正好包含两个元素“红色”和“空白”的数组的所有文档:
db.inventory.find( { tags: ["red", "blank"] } )
希望查找同时包含元素“red”和“blank”的数组,而不考虑数组中的顺序或其他元素,请使用$all运算符
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
- 修改
db.collection.update(查询条件,新对象)
–默认用新对象替换旧对象
–如果需要修改指定的属性,而不是替换为新对象则需要使用修改操作符来完成
$set 可以修改文档中的指定属性
db.stus.update({name : "沙和尚"},{age:18})
db.stus.update({name : "沙和尚"},{$set:{address:流沙河}})
$unset删除属性
–update默认只会修改一个
db.collection.updateMany()
-修改多个符合条件的文档
db.collection.updateOne()
–修改一个符合条件的文档
举栗子
- 删除
db.collection.remove()
-删除符合条件的一个或者多个文档
--如果remove可以根据条件删除文档
--如果只传递空对象作为参数,则清空集合
--必须传递参数,可传空参
db.collection.deleteOne()
db.collection.deleteMany()
-remove()可以根据条件删除文档,传递条件和find一样
db.collection.drop()
-删除集合
db.inventory.find( { qty: { $lt: 20 } } )
db.inventory.update( { "carrier.fee": { $lt: 20 } }, { $set: { price: 9.99 } } )
排序
db.emp.find({}).sort({sal:1})
--1:升序 -1:降序
db.emp.find({}).sort({sal:1,empno:-1})
--按照sal升序再按照empno降序
//limit skip sort 可以任意顺序调用
投影
--在查询时,可以在第二个参数位置设置查询结果的投影
db.emp.find({},{ename:1,_id:0})
--1:显示 0:不显示
mongoose
mongoose使用
--1.下载安装mongoose
npm i mongoose --save
--2.项目中引入mongoose
var mongoose = require("mongoose")
--3.链接mongooseDB数据库
mongoose.connect("mongodb://数据库的ip:端口号/数据库名",{useMongoClient:true});
--如果端口号是默认端口号(27017)则可以省略不写
--4.断开数据库链接
mongoose.disconnect();
--5.监听数据库链接状态
mongoose.connection.once("open",function(){})
mongoose.connection.once("close",function(){})
创建Schema对象
创建model
model代表数据库的集合
mongoose.model(modelName,schema);
--mongoose 会自动将集合名变为复数
var stuModel=mongoose.model("student",stuSchema)
插入文档
stuModel.create({},function(err){});
stuModel.create({
name :"zyn",
age:"18"
},function(err){
});
model
find()
// find all documents
await MyModel.find({});
// find all documents named john and at least 18
await MyModel.find({ name: 'john', age: { $gte: 18 } }).exec();
// executes, passing results to callback
MyModel.find({ name: 'john', age: { $gte: 18 }}, function (err, docs) {});
// executes, name LIKE john and only selecting the "name" and "friends" fields
//投影
await MyModel.find({ name: /john/i }, 'name friends').exec();
// passing options
await MyModel.find({ name: /john/i }, null, { skip: 10 }).exec();
Model.findById()
// Find the adventure with the given `id`, or `null` if not found
await Adventure.findById(id).exec();
// using callback
Adventure.findById(id, function (err, adventure) {});
// select only the adventures name and length
await Adventure.findById(id, 'name length').exec();
Model.findOne()
// Find one adventure whose `country` is 'Croatia', otherwise `null`
await Adventure.findOne({ country: 'Croatia' }).exec();
// using callback
Adventure.findOne({ country: 'Croatia' }, function (err, adventure) {});
// select only the adventures name and length
await Adventure.findOne({ country: 'Croatia' }, 'name length').exec();
Model.update()
const query = { name: 'borne' };
Model.update(query, { name: 'jason bourne' }, options, callback);
// is sent as
Model.update(query, { $set: { name: 'jason bourne' }}, options, function(err, res));
// if overwrite option is false. If overwrite is true, sent without the $set wrapper.
Model.deleteOne()
Model.count()
const count = await Adventure.count({ type: 'jungle' });
console.log('there are %d jungle adventures', count);
Documents
get()与set()
doc.name = ‘foo’;
await doc.save();
toJson()
toObject()