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字段设置为主键

nuget按照mongodb node mongodb_nuget按照mongodb

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)=>{})   // 更新多条