MongoDB
概念:
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
SQL概念 | MongoDB概念 | 解释 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
node连接MongoDB
采用的是Express框架,因此决定使用mongoose来连接MongoDB。
var mongoose=require('mongoose');
mongoose.connect('mongodb://localhost:27017/db');
mongoose.connection.on("connected",()=>{
console.log("MongoDB connected success")
});
mongoose.connection.on("error",()=>{
console.log("MongoDB connected fail")
});
mongoose.connection.on("disconnected",()=>{
console.log("MongoDB connected disconnected")
});
mongoose实际上,可以说是Oracle和mongodb的一个混合产物,但归根接地还是mongodb的。
Oracle | MongoDB | mongoose |
---|---|---|
数据库实例 | MongoDB实例 | Mongoose |
模式(Schema) | 数据库(database) | monogoose |
table | collection | schema+model |
row | document | 实例(instance) |
rowid | _id | _id |
Join | DBRef | DBRef |
mongoose概念:
- Schema: mongoose里会用到的一种数据模式,可以理解为表结构的定义;每个schema会映射到mongodb中的一个collection,它不具备操作数据库的能力
- Model: 是由schema生成的模型,通过集成Schema定义的基本方法和属性得到相关的内容,可以对数据库进行操作
- instance: 这就是实实在在的数据了.
通过 new Model()初始化得到.
let userSchema=mongoose.Schema({
name:String,
age:Number
})
Schema.methods.sayHi=()=>{
console.log('hi')
}
let User=mongoose.model('User',userSchema)
let user=new User({
name:'小明',
age:20
})
user.save((err,user)=>{ //保存数据
if(err){
console.log(err)
}else{
data.sayHi();
}
})
mongoDB不需要提前创建一个collection,在提交save时会自动创建对应的collection,比如上面的名为User的shema,在保存数据的时候会创建一个Users的collection,对,会自动添加一个s。
增删改查操作
增加操作就是上面的save以及create
let params={
name:'小红',
age:20
}
User.create(params,(err,data)=>{})
删除:deleteOne,remove(该方法将被移除,不推荐使用),
let condition={
name:'小红'
}
User.deleteOne(condition,(err,data)=>{})
查询:
let condition={
name:'小明'
}
User.findOne(condition,(err,data)=>{}) //查找一条
User.find(condition,(err,data)=>{}) //多条
findById与findOne相同,但它只接收文档的_id作为参数,返回单个文档
User.findById('_id',(err,data)=>{})
条件查询:
"$lt"(小于),"$lte"(小于等于),"$gt"(大于),"$gte"(大于等于),"$ne"(不等于),"$in"(可单值和多个值的匹配),"$or"(查询多个键值的任意给定值),"$exists"(表示是否存在的意思)"$all".
User.find({age: {"$gte": 18}},(err,data)=>{}) //单个条件
User.find({age: {"$gte": 18, "$lte": 30}},(err,data)=>{}) //多条件 大于等于18小于等于30
User.find({age:{$in: 18}},(err,data)=>{}) // 等于18
User.find({age:{"$in":[18,30]}},(err,data)=>{}) //等于18,30
User.find({$or: [{name: "小明"}, {age: 20}]},(err,data)=>{}) // 查询name为小明或者age为20的所有数据
User.find({$nor: [{name: "小明"}, {age: 20}]},(err,data)=>{}) // 查询name不为小明或者age不为20的所有数据
User.find({name: {$exists: true}},(err,data)=>{}) //所有存在name属性的
模糊查找:
User.find({name: {$regex: '小'}},(err,data)=>{}) //查询所有name中含有xiao的数据
更新:
let condition={
name:'小明'
}
User.updateOne(condition,{$set:{age:21}},(err,data)=>{}) //更新一条
User.update(condition,{$set:{age:21}},(err,data)=>{})
User.updateMany(condition,{$set:{age:21}},(err,data)=>{}) // 更新多条