MongoDB
MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构(BSON)。
具体使用查看官方文档
基本操作#
/* 显示所有数据库 */
show dbs
use 数据库名
/* 显示当前所处的数据库 */
db
/* 显示数据库中所有集合 */
show collections
插入文档#
当向集合中插入文档时,如果没有指定_id,数据库会自动生成
db.collection.insertOne(doc) 插入单个文档
例子:
db.students.insertOne(
{
name:"wang",
age:18,
gender:"male"
}
)
db.collection.insertMany() 插入多个文档
db.students.insertMany([
{
name:"wang",
age:18,
gender:"male"
},
{
name:"zhao",
age:22,
gender:"male"
}
])
查询文档#
db.collection.find() 查找集合中所有符合条件的文档,返回数组
例子:
db.students.find()
db.students.find({
name: "wang"
})
db.students.find({
name: "wang"
})[0] /* 可以添加索引,指定第几条 */
db.students.find().count() /* 所有结果的数量 */
db.collection.findOne() 查找第一个,返回文档对象
修改文档#
db.collection.updateOne(查询条件, 新对象)
- $set 修改文档中的指定属性
- $unset 删除文档的指定属性
例子:
db.students.updateOne(
{name: "wang"},
{
$set:{
name: "wang2"
}
}
)
db.collection.updateMany(查询条件, 新对象)
db.collection.replaceOne() 替换文档
删除文档#
db.collection.deleteMany()
db.collection.deleteOne()
db.collection.drop()
db.dropDatabase() 删除数据库
db.students.deleteMany({name: "wang"})
/* 清空集合,性能差 */
db.students.deleteMany({})
/* 以下语句可以删除集合 */
db.students.drop()
Note
一般使用一个字段来表示是否删除(逻辑删除),而不是直接使用delete方法
练习#
use my_test
db.users.insertOne({
username: 'wang'
})
db.users.find()
db.users.insertOne({
username: 'zhang'
})
db.users.find().count()
db.users.find({
username: 'wang'
})
db.users.updateOne(
{username: 'wang'},
{
$set: {
address: 'shanxi'
}
}
)
db.users.replaceOne(
{username: 'zhang'},
{username: 'zhang2'}
)
db.users.updateOne(
{username: 'wang'},
{
$unset: {
address: 1
}
}
)
db.users.updateOne(
{username: 'wang'},
{
$set: {
hobby: {
cities: ['beijing', 'shanghai', 'shenzhen'],
movies: ['sanguo', 'hero']
}
}
}
)
db.users.updateOne(
{username: 'zhang2'},
{
$set: {
hobby: {
movies: ['movie1', 'movie2']
}
}
}
)
/* 内嵌文档查询时必须使用引号 */
db.users.find(
{'hobby.movies': 'hero'}
)
/* $push向数组中添加一个新的元素 */
/* $addToSet 也是向数组中添加一个新元素, 如果数组中已经存在该元素, 则不会添加 */
db.users.updateOne(
{username: 'zhang2'},
{
$push: {
'hobby.movies': 'new movie'
}
}
)
db.users.deleteOne({'hobby.cities': 'beijing'})
db.users.drop()
/* 插入多条数据 */
var arr = []
for(var i = 1; i < 20000; i++){
arr.push({num: i})
}
db.numbers.insertMany(arr)
db.numbers.find({num: 500})
/* x>=500 */
db.numbers.find(
{num: {$gte: 500}}
)
/* x<30 */
db.numbers.find(
{num: {$lt: 30}}
)
/* 50>x>40 */
db.numbers.find(
{
num: {
$gt: 40,
$lt: 50
}
}
)
/* x<10 || x>19990 */
db.numbers.find(
{
$or: [
{num: {$lt: 10}},
{num: {$gt: 19990}}
]
}
)
/* 大于19990的增加0.1 */
db.numbers.updateMany(
{num: {$gt: 19990}},
{
$inc: {
num: 0.1
}
}
)
/* 前十条数据 */
db.numbers.find().limit(10)
/* 11条到20条 */
db.numbers.find().skip(10).limit(10)
/* 21到30 */
db.numbers.find().skip(20).limit(10)
/* skip((页码 - 1) * 每页的条数).limit(每页的条数) */
/* skip 和 limit 的顺序对结果没有影响 */
sort#
/* 1表示升序 -1表示降序 */
/* limit skip sort的顺序对结果没有影响 */
db.numbers.find().sort({num:1, num2:-1})
投影#
/* 第二个参数,类似于MySQL指定字段 */
db.numbers.find({}, {number:1, _id:0})
Mongoose#
通过node来操作MongoDB
官网
npm i mongoose --save
基本操作#
const mongoose = require('mongoose')
/*
mongodb://ip地址:端口号/数据库名
端口号为27017则可以省略
*/
mongoose.connect('mongodb://localhost/test')
/*
mongoose对象中的connection表示的是数据库连接,通过监视它的状态,可以监听数据库的连接和断开
*/
mongoose.connection.once('open', function () {
console.log('数据库连接了')
})
mongoose.connection.once('close', function () {
console.log('数据库关闭了')
})
/*
创建Schema对象
*/
const Schema = mongoose.Schema
const stuSchema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: 'female'
},
address: String
})
/*
通过Schema来创建Model
第一个是集合名, 第二个是创建的Schema对象
mongoose将会自动将集合名改为复数,下列语句创建了students的集合
*/
const StuModel = mongoose.model('student', stuSchema)
/*
插入文档
*/
StuModel.create(
{
name: 'wang',
age: 18,
gender: 'male',
address: 'shanxi'
},
function (err) {
if (!err) {
console.log('插入成功')
}
}
)
StuModel.create({
name: 'zhang',
age: 23,
gender: 'male',
address: 'shanxi'
}).then(() => {
console.log('插入成功')
})
/*
查询
- Model.find(conditions, [projection], [options], [callback])
- conditions 查询条件
- projection 投影 { name: 1, _id: 0 }和'name -_id'效果一致
- options 查询选项(skip, limit)
- callback
- Model.findById()
- Model.findOne()
返回的doc是Model的实例 (doc instanceof StuModel) === true
*/
StuModel.find(
{ name: 'wang' },
'name -_id',
{ skip: 1, limit: 1 },
function (err, docs) {
if (!err) {
console.log('查询成功', docs)
}
}
)
/*
修改
- Model.update() //废弃
- Model.updateMany()
- Model.updateOne()
- Model.replaceOne()
*/
StuModel.updateMany(
{ name: 'wang' },
{
$set: {
age: 20
}
},
function (err) {
if (!err) {
console.log('修改成功')
}
}
)
/*
删除
- Model.remove() // 废弃
- Model.deleteOne()
- Model.deleteMany()
*/
StuModel.deleteMany({}, function (err) {
if (!err) {
console.log('删除成功')
}
})
/*
统计文档数量
- Model.count()
*/
StuModel.count({}, function (err, count) {
if (!err) {
console.log(count)
}
})
/*
断开连接
*/
//mongoose.disconnect()
Document的方法#
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/test')
mongoose.connection.once('open', function () {
console.log('数据库连接了')
})
mongoose.connection.once('close', function () {
console.log('数据库关闭了')
})
const Schema = mongoose.Schema
const stuSchema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: 'female'
},
address: String
})
const StuModel = mongoose.model('student', stuSchema)
/*
Document和集合中的文档一一对应,Document是Model的实例,通过Model查询到的结果都是Document
*/
const stu = new StuModel({
name: 'liu',
age: 5,
gender: 'female',
address: 'unknown'
})
stu.save(function (err) {
if (!err) {
console.log('保存成功')
}
})
StuModel.findOne({ name: 'wang' }, function (err, doc) {
if (!err) {
doc.update({ $set: { age: 28 } }, function (err) {
if (!err) {
console.log('修改成功')
}
})
}
})