基本信息
下载以及安装
1.https://www.mongodb.com/try/download/community 下载地址
2.下载 mongodb-win32-x86_64-windows-5.0.18 zip 解压 配置好 path 就可以用了
3.mongodb 默认数据保存位置 C:\data\db
常见命令
1.show dbs //查看已经有了表的数据库
2.db.createCollection("test") //创建数据表
1.use 的谁 这个表就创建在谁的下面
2.use 数据库之后 之后 db.abc.insert({name:"zs"}) 就算 abc 表没有建立 在 当前 use 的数据库中
1.只要插入数据 表就建立了 也就是说插入和建表同时进行了
3.use dbname // 即可创建数据库 但是 show dbs 查询不到 必须建立表
4.db.dbname.insert({name:"zs"})
1.表没有预先的解构 可以先插入 name 当前表结构就只有 _id 和 name
2.再插入 db.dbname.insert({age:18}) 第二条数据 表结构 _id name age 第一条数据 age为 ""
5.db 显示当前自己所在的数据库
6.use dbname db.dropDatabase() 删除 use 的数据库
7.show collections 显示当前 数据库 所有的表
8.db.abc.drop() 删除表 abc 当然 use 的 库中必须有 abc表 也就是说 use 库很关键
1.添加 删除 都在对改数据库
9.db.abc.find() 返回 abc 表中的所有数据
1.等价于 db.getCollection("abc").find()
2.db.getCollection("abc").find({age:20}) // 只查询年龄等于 20 的
1.当然也等价于 db.abc..find({age:20})
3.也可以 像 mongoose 一样 db.abc.find({age:{$lt:18}})
1.db.bbb.find({$or:[{age:{$lt:19}},{age:{$gt:25}}]})
2.db.bbb.find({name:/ang$/i})
3.db.bbb.find({name:new RegExp("wang$","i")})
4.db.bbb.find({},{name:1,_id:0}) 查询某些列
1.name:1 查询此列 默认 有 _id 如果不想要 可以设置为 0
2.也可设置 某个 为 0 其他几个没有设置的 那么就都显示出来
10.db.abc.update({age:20},{name:"zs",age:21}) 如果只写 {age:21} name 就会被覆盖掉 如果不想被覆盖
1.db.abc.update({age:20},{$set:{a:21}})
11.db.abc.remove({age:14}) 删除一条数据
12.db.bbb.find().sort({age:1}) 排序
13.db.bbb.find().skip(1).limit(1) 跳过 限制
杂项
1.mongod 出现 exitCode:100
1.mongod -dbpath E:\MongoDB\data 需要加上 数据库位置
node 库 mongoose
安装和使用
1.npm i mongoose@6.11.2 最新版本 测试安装后 导入出错
2.mongoose.set("strictQuery", true) //禁止提示一堆什么玩意儿
3.mongoose.connect(`mongodb://${dbhost}:${dbport}/${dbname}`) 连接后 该绑定事件
4.绑定事件
1.mongoose.connection.once("open" () => {})
1.所有逻辑代码 都是基于此开发
2.mongoose.connection.once("error/close" () => {})
5.规定表结构 并 添加数据
1.let AccountsSchema = new mongoose.Schema({amount:{type:String,default:"789",required:true},comment:{}})
1.创建表结构 拿表结构去创建表[model] 注意这个表结构的 Schemo 必须大写 要new 自然是个构造函数
2.这个表结构插入数据前创建的 很灵活 可以比之前 的表 多一项 [这是 mysql 等其他传统数据库没有的]
3.Schema 中 type 的类型
1.String Number Boolean Array Date Buffer[文件一般不用] Mixed Objectid Decimal128
1.Mixed 需这样设置 type:mongoose.Schema.Types.Mixed
2.Objectid type:mongoose.Schema.Types.Objectid
2.Objectid type:mongoose.Schema.Types.Decimal128
2.复合类型
1.[Number] [String] [[]] [[Number]],
4.如果在Schema中没有定义的属性 在 model.create 的时候 多了一个属性 也不会报错
5.定义Schema属性 经常有的配合属性
1.required:true,default:"abc",enum:["male","female"],unique:true
1.required: true //有默认项 required 不用设置 因为必定有数值
2.一旦设置了 unique:true 表生成后 再去去掉这个 unique 不行 必须删除表 重新来 才可以
2.let accountModel = ongoose.model("account", AccountSchema)
1.以刚才创建的Schema来创建 account 表 返回一个表 可以在这个表中 增删改查
1.这个 account 表 mongoose 会自动加 s 变成最后的表名 accounts [居然符合英语的单三人称变化规则]
2.如何强制不让它多管闲事 [答案 传入第三个参数 强制表名 congoose.model("bbc",StuSchema,"bbc")]
3.以刚才创建的 accountModel 表名 添加 数据 不是add 居然是 create
1.参考以下代码
AccountModel.create({
amount: "127.03",
comment: "买电脑",
type: "1"
},(error,data) => {
if(error){
console.log(error)
return;
}
console.log(data)
//这个返回的是添加成功的数据对象
{
amount: 127.03,
comment: '买电脑',
type: '1',
date: 2023-06-30T03:40:29.000Z,
_id: new ObjectId("649e4eadf8c5e892ed4ce56e"),
__v: 0
}
})
2.添加数据的两种形式
var Tank = mongoose.model('Tank', yourSchema);
var small = new Tank({ size: 'small' });
small.save(function (err) {
if (err) return handleError(err);
// saved!
})
// or
Tank.create({ size: 'small' }, function (err, small) {
if (err) return handleError(err);
// saved!
})
4.Schema 中的 索引
index: 布尔值 是否对这个属性创建索引
unique: 布尔值 是否对这个属性创建唯一索引
sparse: 布尔值 是否对这个属性创建稀疏索引
var schema2 = new Schema({
test: {
type: String,
index: true,
unique: true // Unique index. If you specify `unique: true`
// specifying `index: true` is optional if you do `unique: true`
}
});
6.常用数据库操作命令
1.stuModel.find({},cb)//返回所有查到的数据 [obj1,obj2] 数组模式 如果查不到返回空数组
1.这种可以 一半用链式操作 stuModel.find({条件},{fields}).sort({age:1,_id:0}).exec(cb)
1.等价于 stuModel.find({条件}).select{fields}).sort({age:1,_id:0}).exec(cb)
2.也可以 stuModel.updateMany({},{}).sort({}).exec(cb)
2.stuModel.findOne({},cb)//返回所有查到的数据 obj1 一个对象 如果查不到 返回 null
3.stuModel.deleteOne({},cb)
4.stuModel.deleteMany({},cb)
5.stuModel.updateOne({},{},cb)
6.stuModel.updateMany({},{},cb)
7.关于查询条件的的种类
1.{age:3} age 等于 3 {age:{$lt:3}} age 小于 3 {age:{$gt:3}} age 大于 3
2.$gte >= $lte <= $ne !==
3.{$or:[{age:3},{age:6}]} // age==3 || age==6
4.{$and:[{age:{$gt:3}},{age:{$lt:6}}]} age>3 && age<6 可以多条件
5.$lt $gt $lte $gte $ne //< > <= >= !==
6.正则表达式
1.{age:/wh$/i} / {age:new RegExp("wh","i")}
8.个性化链式操作
1.stuModel.find().select(["age","name"]).exec((error,data) => {})
2.stuModel.find().select({sex:1,name:1,_id:0}).exec((error,data) => {})
3.条件操作可以是对象 也可以是数组 但是 数组 无法控制 _id 的返回 对象可以
7.超级灵活的链式操作
1. stuModel.find({age:{$gt:1}}).where("age").lt(7).select({age:1,name:1,_id:0}).sort({age:-1,name:-1}).exec(cb)
2.看这个骚操作
Person.
find({ occupation: /host/ }).
where('name.last').equals('Ghost').
where('age').gt(17).lt(66).
where('likes').in(['vaporizing', 'talking']).
skip(3).
limit(10).
sort('-occupation').
select('name occupation').
exec(callback);
8.重大 坑
1.通过 黑窗口 添加的数据 没有 _v [默认为0] mongoose
2.查询时候 不需要 schema {} 空 schema 创建的对象 也可以查询
3.mongoose create 的时候 会在 指定的 abc 表名 上变复数 abcs
1.查询的时候 abcs 和 abc 都可以查询出来
1.它怎么知道 abcs 不用加s呢
2.如何强制不让它多管闲事 [答案 传入第三个参数 强制表名 congoose.model("bbc",StuSchema,"bbc")]
9.关于 mongoose 不同页面引入的问题 是否每次都需要链接数据库 [多页面引入mongoose]
1.这里包括其他页面引入 和 mongoose 变量名字无关
2.只要在 db 中链接成功 确保其他代码在 db open 回调中执行 其他页面只要引入 mongoose都是 可以直接使用的
代码实例
Schema 大全 代码
var numberSchema = new Schema({
integerOnly: {
type: Number,
get: v => Math.round(v),
set: v => Math.round(v),
alias: 'i'
}
});
var Number = mongoose.model('Number', numberSchema);
var doc = new Number();
doc.integerOnly = 2.001;
doc.integerOnly; // 2
doc.i; // 2
doc.i = 3.001;
doc.integerOnly; // 3
doc.i; // 3
///////////////////////////////////////////////
var schema = new Schema({
name: String,
binary: Buffer,
living: Boolean,
updated: { type: Date, default: Date.now },
age: { type: Number, min: 18, max: 65 },
mixed: Schema.Types.Mixed,
_someId: Schema.Types.ObjectId,
decimal: Schema.Types.Decimal128,
array: [],
ofString: [String],
ofNumber: [Number],
ofDates: [Date],
ofBuffer: [Buffer],
ofBoolean: [Boolean],
ofMixed: [Schema.Types.Mixed],
ofObjectId: [Schema.Types.ObjectId],
ofArrays: [[]],
ofArrayOfNumbers: [[Number]],
nested: {
stuff: { type: String, lowercase: true, trim: true }
}
})
// example use
var Thing = mongoose.model('Thing', schema);
var m = new Thing;
m.name = 'Statue of Liberty';
m.age = 125;
m.updated = new Date;
m.binary = new Buffer(0);
m.living = false;
m.mixed = { any: { thing: 'i want' } };
m.markModified('mixed');
m._someId = new mongoose.Types.ObjectId;
m.array.push(1);
m.ofString.push("strings!");
m.ofNumber.unshift(1,2,3,4);
m.ofDates.addToSet(new Date);
m.ofBuffer.pop();
m.ofMixed = [1, [], 'three', { four: 5 }];
m.nested.stuff = 'good';
m.save(callback);
mongoose 初体验
const mongoose = require("mongoose")
const { dbhost, dbport, dbname } = require("./config/config")
// console.log(dbhost, dbport, dbname ,`mongodb://${dbhost}:${dbport}/${dbname}`)
//禁止提示一堆什么玩意儿
mongoose.set("strictQuery", true)
mongoose.connect(`mongodb://${dbhost}:${dbport}/${dbname}`)
const db = mongoose.connection
db.once("open", () => {
console.log("connect successful")
let AccountSchema = new mongoose.Schema({
amount: {
type: Number,
default: 100.01,
required: true //有默认项 required 不用设置 因为必定有数值
},
comment: {
type: String,
default: "money"
},
type: {
type: String,
default: "-1"
}
});
let AccountModel = mongoose.model("account", AccountSchema)
AccountModel.create({
amount: "127.03",
comment: "买电脑",
type: "1"
},(error,data) => {
if(error){
console.log(error)
return;
}
console.log(data)
})
})
db.on("error", () => {
console.log("connect error")
})
db.on("close", () => {
console.log("connect disconnect")
})