mongodb

基本信息

下载以及安装

	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")
})

posted @ 2023-06-30 00:11  闭区间  阅读(4)  评论(0编辑  收藏  举报