zoukankan      html  css  js  c++  java
  • Mongoose 使用Node操作MongoDB

    Mongoose好处

    • 可以为文档创建一个模式结构(Schema) 可以对模型中的对象/文档进行验证
    • 数据可以通过类型转换转换为对象模型
    • 可以使用中间件来应用业务逻辑挂钩
    • 比Node原生的MongoDB驱动更容易

    Mongoose提供的新对象

    – Schema(模式对象) 对象定义约束了数据库中的文档结构
    – Model 对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
    – Document 表示集合中的具体文档,相当于集合中的一个具体的文档

    下载安装

    • npm i mongoose --save

    基本用法

    //引入
    var mongoose = require("mongoose");
    //连接数据库
    mongoose.connect("mongodb://127.0.0.1/mongoose_test" , { useNewUrlParser: true, useUnifiedTopology:true});
    
    mongoose.connection.once("open",function(){
    	console.log("--> 数据库连接成功");
    });
    
    mongoose.connection.once("close",function(){
    	console.log("--> 数据库连接已经断开");
    });
    
    //断开数据库连接
    //mongoose.disconnect();
    
    //将mongoose.Schema 赋值给一个变量
    var Schema = mongoose.Schema;
    
    //创建Schema(模式)对象
    var stuSchema = new Schema({
    
    	name:String,
    	age:Number,
    	gender:{
    		type:String,
    		default:"female"
    	},
    	address:String
    
    });
    
    //通过Schema来创建Model
    //Model代表的是数据库中的集合,通过Model才能对数据库进行操作
    //mongoose.model(modelName, schema):
    //modelName 就是要映射的集合名 mongoose会自动将集合名变成复数
    var StuModel = mongoose.model("student" , stuSchema);
    
    
    /*
    	- 有了Model,我们就可以来对数据库进行增删改查的操作了
    
     	Model.create(doc(s), [callback])
     	- 用来创建一个或多个文档并添加到数据库中
     	- 参数:
     		doc(s) 可以是一个文档对象,也可以是一个文档对象的数组
     		callback 当操作完成以后调用的回调函数
    
     	查询的:
    	 Model.find(conditions, [projection], [options], [callback])
    	 	- 查询所有符合条件的文档 总会返回一个数组
    	 Model.findById(id, [projection], [options], [callback])
    	 	- 根据文档的id属性查询文档
    	 Model.findOne([conditions], [projection], [options], [callback])
    	 	- 查询符合条件的第一个文档 总和返回一个具体的文档对象
    
     		conditions 查询的条件
     		projection 投影 需要获取到的字段
     			- 两种方式
     				{name:1,_id:0}
     				"name -_id"
     		options  查询选项(skip limit)
     				{skip:3 , limit:1}
     		callback 回调函数,查询结果会通过回调函数返回
     					回调函数必须传,如果不传回调函数,压根不会查询
    
     */
    //增:StuModel.create(doc, function(err){});
    StuModel.create({
    	name:"张三",
    	age:16,
    	address:"北京"
    },function (err) {
    	if(!err){
    		console.log("插入成功");
    	}
    });
    
    //查
    StuModel.find({},"name age -_id", {skip:3 , limit:1} , function (err , docs) {
    	if(!err){
    		console.log(docs);
    	}
    });
    
    
    /*
    	修改
     Model.update(conditions, doc, [options], [callback])
     Model.updateMany(conditions, doc, [options], [callback])
     Model.updateOne(conditions, doc, [options], [callback])
     	- 用来修改一个或多个文档
     	- 参数:
     		conditions 查询条件
     		doc 修改后的对象
     		options 配置参数
     		callback 回调函数
     Model.replaceOne(conditions, doc, [options], [callback])
    * */
    StuModel.updateOne({name:"张三"},{$set:{age:20}},function (err) {
    	if(!err){
    		console.log("修改成功");
    	}
    });
    
    
    /*
    	删除:
     Model.remove(conditions, [callback])
     Model.deleteOne(conditions, [callback])
     Model.deleteMany(conditions, [callback])
     */
    StuModel.remove({name:"李四"},function (err) {
    	if(!err){
    		console.log("删除成功");
    	}
    });
    
    
    
    /*
     Model.count(conditions, [callback])
     	- 统计文档的数量的
     */
    StuModel.count({},function (err , count) {
    	if(!err){
    		console.log(count);
    	}
    });
    
    
    //创建一个Document
    var stu = new StuModel({
    	name:"奔波霸",
    	age:48,
    	gender:"male",
    	address:"碧波潭"
    });
    stu.save(function (err) {
    	if(!err){
    		console.log("保存成功~~~");
    	}
    });
    
    StuModel.findOne({},function (err , doc) {
    	if(!err){
    		/*
    		 	update(update,[options],[callback])
    		 		- 修改对象
    		 	remove([callback])
    		 		- 删除对象
    
    		 */
    		//console.log(doc);
    		/*doc.update({$set:{age:28}},function (err) {
    			if(!err){
    				console.log("修改成功~~~");
    			}
    		});*/
    
    		/*doc.age = 18;
    		doc.save();*/
    
    		/*doc.remove(function (err) {
    			if(!err){
    				console.log("大师兄再见~~~");
    			}
    		});*/
    
    
    		/*
    			get(name)
    				- 获取文档中的指定属性值
    			set(name , value)
    				- 设置文档的指定的属性值
    			id
    				- 获取文档的_id属性值
    			 toJSON() ******
    			 	- 转换为一个JSON对象
    
    			 toObject()
    			 	- 将Document对象转换为一个普通的JS对象
    			 		转换为普通的js对象以后,注意所有的Document对象的方法或属性都不能使用了
    
    		 */
    		//console.log(doc.get("age"));
    		//console.log(doc.age);
    
    		//doc.set("name","猪小小");
    		//doc.name = "hahaha";
    
    		//console.log(doc._id);
    		//var j = doc.toJSON();
    		//console.log(j);
    
    		//var o = doc.toObject();
    
    		//console.log(o);
    
    		doc = doc.toObject();
    
    		delete doc.address;
    
    		console.log(doc._id);
    
    	}
    });
    

    创建Schema模式对象

    var userSchema = new Schema(definition, option);
    
    • options常用选项
      • autoIndex 布尔值,开启自动索引,默认true
      • bufferCommands 布尔值,缓存由于连接问题无法执行的语句,默认true
      • capped 集合中最大文档数量
      • collection 指定应用Schema的集合名称
      • id 布尔值,是否有应用于_id的id处理器,默认true
      • _id 布尔值,是否自动分配id字段,默认true
      • strict 布尔值,不符合Schema的对象不会被插入进数据库,默认true
    • 定义Schema模式对象
      • 模式为集合中的文档定义字段和字段类型。
      • 对于在模式中的每个字段,你都需要定一个特定的值类
        型。受支持的类型如下:
        • String
        • Number
        • Boolean
        • Array
        • Buffer
        • Date
        • ObjectId或Oid
        • Mixed
      • 需要为每个不同的文档类型都定义一个模式

    创建Model模型对象

    • model(name, [schema], [collection] , [skipInit])
      • name参数相当于模型的名字,以后可以同过name找到模型。
      • schema是创建好的模式对象。
      • collection是要连接的集合名。
      • skipInit是否跳过初始化,默认是false
    • model对象的方法
      • remove(conditions, callback)
      • deleteOne(conditions, callback)
      • deleteMany(conditions, callback)
      • find(conditions, projection, options, callback)
      • findById(id, projection, options, callback)
      • findOne(conditions, projection, options, callback)
      • count(conditions, callback)
      • create(doc, callback)
      • update(conditions, doc, options, callback)
      • ...

    创建Document文档对象

    • document对象的方法
      • equals(doc)
      • id
      • get(path,[type])
      • set(path,value,[type])
      • update(update,[options],[callback])
      • save([callback])
      • remove([callback])
      • isNew
      • isInit(path)
      • toJSON()
      • toObject()
      • ...
  • 相关阅读:
    第 1 章 第 11 题 图纸传递问题
    第 1 章 第 10 题 主键查找问题 哈希表实现
    第 1 章 第 9 题 使用未初始化数组问题 设立辅助数组实现
    第 1 章 第 8 题 分批排序问题( 扩展 ) 位向量实现
    第 1 章 第 7 题 位向量中的异常处理问题
    JAVA实现多线程处理批量发送短信、APP推送
    转载的一些面试题
    使用Flexible实现手淘H5页面的终端适配
    2016前端代码总结
    移动前端的一些坑和解决方法(外观表现)
  • 原文地址:https://www.cnblogs.com/KevinTseng/p/11899415.html
Copyright © 2011-2022 走看看