day03-数据库概念&mongodb使用&数据库CLUD操作

【002】全国30m逐年土地利用数据CLCD数据(1985-2023年) 使用 Google 地球引擎上的 335,709 张 Landsat 图像,结合从中国土地利用/覆盖数据集(CLUD)中提取的稳定样本和来自卫星时间序列数据、谷歌地球和谷歌地图的视觉解释样本收集训练样本。该数据集依托Google地球引擎(GEE)的335,709张Landsat影像,构建起1985 - 2022年中国首个基于Landsat的年度土地覆被产品(CLCD)。2、通过结合从中国土地利用/覆盖数据集(CLUD)中提取的稳定样本和来自卫星时间序列数据、谷歌地球和谷歌地图的视觉解释样本收集训练样本; 阅读详情

数据库概念&环境搭建

目标

  • 能够安装数据库软件
  • 能够知道集合、文档的概念
  • 能够使用mongoose创建集合的方法创建集合

为什么要使用数据库(★★★)

  • 动态网站中的数据都是存储在数据库中的
  • 数据库可以用来持久存储客户端通过表单收集的用户信息
  • 数据库软件本身可以对数据进行高效的管理

什么是数据库(★★★)

  • 数据库即存储数据的仓库,可以将数据进行有序的分门别类的存储。它是独立于语言之外的软件,可以通过API去操作它。
  • 常见的数据库软件有:mysql、mongoDB、oracle。

MongoDB数据库下载安装(★★★)

**下载地址:**https://www.mongodb.com/download-center/community

[外链图片转存失败(img-PSBhGB4g-1568473363876)(images/mongodb.png)]

MongoDB可视化软件

MongoDB可视化操作软件,是使用图形界面操作数据库的一种方式。

[外链图片转存失败(img-2pXOdhvm-1568473363878)(images/sql-keshihua.png)]

数据库相关概念(★★★)

在一个数据库软件中可以包含多个数据仓库,在每个数据仓库中可以包含多个数据集合,每个数据集合中可以包含多条文档(具体的数据)。

术语解释说明
database数据库,mongoDB数据库软件中可以建立多个数据库
collection集合,一组数据的集合,可以理解为JavaScript中的数组
document文档,一条具体的数据,可以理解为JavaScript中的对象
field字段,文档中的属性名称,可以理解为JavaScript中的对象属性

Mongoose第三方包

  • 使用Node.js操作MongoDB数据库需要依赖Node.js第三方包mongoose
  • 使用npm install mongoose命令下载

启动MongoDB

在命令行工具中运行net start mongoDB即可启动MongoDB,否则MongoDB将无法连接。

MongoDB增删改查(CLUD)操作

目标

  • 能够对数据库中的数据进行增删改查操作

数据库连接(★★★)

使用mongoose提供的connect方法即可连接数据库。

// 引入mongoose第三方模块 用来操作数据库
const mongoose = require('mongoose');
// 数据库连接
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true})
	// 连接成功
	.then(() => console.log('数据库连接成功'))
	// 连接失败
	.catch(err => console.log(err, '数据库连接失败'));

创建集合(创建表)(★★★)

创建集合分为两步,一是对对集合设定规则,二是创建集合,创建mongoose.Schema构造函数的实例即可创建集合。

 // 设定集合规则
 const courseSchema = new mongoose.Schema({
     name: String,
     author: String,
     isPublished: Boolean
 });
  // 创建集合并应用规则
 const Course = mongoose.model('Course', courseSchema); // courses

创建文档(插入数据)(★★★)

创建文档实际上就是向集合中插入数据。

分为两步:

  • 创建集合实例。
  • 调用实例对象下的save方法将数据保存到数据库中。
// 创建集合实例
 const course = new Course({
     name: 'Node.js course',
     author: '黑马讲师',
     tags: ['node', 'backend'],
     isPublished: true
 });
  // 将数据保存到数据库中
 course.save();

插入数据另外一种方法

//写法一
Course.create({name: 'JavaScript基础', author: '黑马讲师', isPublish: true}, (err, doc) => { 
     //  错误对象
    console.log(err)
     //  当前插入的文档
    console.log(doc)
});
//写法二
Course.create({name: 'JavaScript基础', author: '黑马讲师', isPublish: true})
      .then(doc => console.log(doc))
      .catch(err => console.log(err))

mongoDB数据库导入数据

找到mongodb数据库的安装目录,将安装目录下的bin目录放置在环境变量中

[外链图片转存失败(img-xP1pH4u2-1568473363879)(images/mongodb-path.png)]

mongoimport –d 数据库名称 –c 集合名称 –-file 要导入的数据文件

mongoimport -d test -c users --file 数据文件的路径

查询文档(数据)(★★★)

利用find的方法查询

查询所有(★★★)

//定义好表规则
const user = new mongodb.Schema({
    _id: String,
    username: String,
    password: Number,
    age: Number,
    name: String,
    hobbies: [String],
    email: String
});
//生成对应的对象索引
const userEntity = mongodb.model('User', user);
//  根据条件查找文档(条件为空则查找所有文档)
Course.find().then(result => console.log(result))
// 返回文档集合
[{
    _id: 5c0917ed37ec9b03c07cf95f,
    name: 'node.js基础',
    author: '黑马讲师‘
},{
     _id: 5c09dea28acfb814980ff827,
     name: 'Javascript',
     author: '黑马讲师‘
}]

根据条件查询(★★★)

//定义好表规则
const user = new mongodb.Schema({
    _id: String,
    username: String,
    password: Number,
    age: Number,
    name: String,
    hobbies: [String],
    email: String
});
//生成对应的对象索引
const userEntity = mongodb.model('User', user);
//  根据条件查找文档
userEntity.findOne({name: 'node.js基础'}).then(result => console.log(result))

// 返回文档
 {
    _id: 5c0917ed37ec9b03c07cf95f,
    name: 'node.js基础',
    author: '黑马讲师‘
}

多条件查询(★★)

根据范围查询
//  匹配大于 小于
 userEntity.find({age: {$gt: 20, $lt: 50}}).then(result => console.log(result))

####包含某字符

 //  匹配包含
 userEntity.find({hobbies: {$in: ['敲代码']}}).then(result => console.log(result))

查询某一个字段
//  选择要查询的字段  
userEntity.find().select('name email').then(result => console.log(result))
排序查询
 // 将数据按照年龄进行排序 升序
 userEntity.find().sort('age').then(result => console.log(result))
 // 将数据按照年龄进行排序 降序
 userEntity.find().sort('-age').then(result => console.log(result))
分页查询
//  skip 跳过多少条数据  limit 查询几条数据
 userEntity.find().skip(2).limit(2).then(result => console.log(result))

删除文档(★★★)

删除单条数据
//定义好表规则
const user = new mongodb.Schema({
    _id: String,
    username: String,
    password: Number,
    age: Number,
    name: String,
    hobbies: [String],
    email: String
});
//生成对应的对象索引
const userEntity = mongodb.model('User', user);
// 删除单个
userEntity.findOneAndDelete({}).then(result => console.log(result))

删除多个数据
//定义好表规则
const user = new mongodb.Schema({
    _id: String,
    username: String,
    password: Number,
    age: Number,
    name: String,
    hobbies: [String],
    email: String
});
//生成对应的对象索引
const userEntity = mongodb.model('User', user);
// 删除多个
userEntity.deleteMany({}).then(result => console.log(result))

更新文档(★★★)

更新单条数据
// 更新单个
User.updateOne({查询条件}, {要修改的值}).then(result => console.log(result))
更新多条数据
// 更新多个
User.updateMany({查询条件}, {要更改的值}).then(result => console.log(result))

mongoose验证(★★)

在创建集合规则时,可以设置当前字段的验证规则,验证失败就则输入插入失败。说白了,就是规定我们插入数据库每一项的条件

  • required: true 必传字段
  • minlength:3 字符串最小长度
  • maxlength: 20 字符串最大长度
  • min: 2 数值最小为2
  • max: 100 数值最大为100
  • enum: [‘html’, ‘css’, ‘javascript’, ‘node.js’]
  • trim: true 去除字符串两边的空格
  • validate: 自定义验证器
  • default: 默认值

代码示例

const postSchema = new mongoose.Schema({
	title: {
		type: String,
		// 必选字段
		required: [true, '请传入文章标题'],
		// 字符串的最小长度
		minlength: [2, '文章长度不能小于2'],
		// 字符串的最大长度
		maxlength: [5, '文章长度最大不能超过5'],
		// 去除字符串两边的空格
		trim: true
	},
	age: {
		type: Number,
		// 数字的最小范围
		min: 18,
		// 数字的最大范围
		max: 100
	},
	publishDate: {
		type: Date,
		// 默认值
		default: Date.now
	},
	category: {
		type: String,
		// 枚举 列举出当前字段可以拥有的值
		enum: {
			values: ['html', 'css', 'javascript', 'node.js'],
			message: '分类名称要在一定的范围内才可以'
		}
	},
	author: {
		type: String,
		validate: {
			validator: v => {
				// 返回布尔值
				// true 验证成功
				// false 验证失败
				// v 要验证的值
				return v && v.length > 4
			},
			// 自定义错误信息
			message: '传入的值不符合验证规则'
		}
	}
});
如何捕获验证的错误信息
.catch(error => {
		// 获取错误信息对象
		const err = error.errors;
		// 循环错误信息对象
		for (var attr in err) {
			// 将错误信息打印到控制台中
			console.log(err[attr]['message']);
		}
	})

集合关联(★★)

通常不同集合的数据之间是有关系的,例如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的,要查询文章的所有信息包括发表用户,就需要用到集合关联。

  • 使用id对集合进行关联
  • 使用populate方法进行关联集合查询

[外链图片转存失败(img-BTin8s7w-1568473363880)(images/关联查询.png)]

示例demo
// 用户集合
const User = mongoose.model('User', new mongoose.Schema({ 
    name: { type: String } 
})); 
// 文章集合
const Post = mongoose.model('Post', new mongoose.Schema({
    title: { 
        type: String 
    },
    // 使用ID将文章集合和作者集合进行关联
    author: { 
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'User' 
    }
}));
const userEntity = mongodb.model('User', user);
const postEntity = mongodb.model('Post', title);
//1.插入数据的时候需要关联起来
userEntity.create({ name: '王五' }).then(result => console.log(result));
postEntity.create({ title: '射雕英雄传', author: '5c95ac7d18f84d8fac8ee4e1' }).then(resule => console.log(result));
//联合查询
postEntity.find()
      .populate('author')
      .then((err, result) => console.log(result));

用户信息增删改查(★★★)

功能

搭建网站服务器,实现客户端与服务器端的通信
连接数据库,创建用户集合,向集合中插入文档
当用户访问/list时,将所有用户信息查询出来
将用户信息和表格HTML进行拼接并将拼接结果响应回客户端
当用户访问/add时,呈现表单页面,并实现添加用户信息功能
当用户访问/modify时,呈现修改页面,并实现修改用户信息功能
当用户访问/delete时,实现用户删除功能

步骤

1.创建服务器

const http = require('http');
const app = http.createServer();

2.引入mongodb模块,链接数据库

const mongoose = require('mongoose');
// 数据库连接 27017是mongodb数据库的默认端口
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
	.then(() => console.log('数据库连接成功'))
	.catch(() => console.log('数据库连接失败'));

3.创建用户表规则,获取集合

const userSchema = new mongoose.Schema({
	name: {
		type: String,
		required: true,
		minlength: 2,
		maxlength: 20
	},
	age: {
		type: Number,
		min: 18,
		max: 80
	},
	password: String,
	email: String,
	hobbies: [ String ]
});

// 创建集合 返回集合构造函数
const User = mongoose.model('User', userSchema);

4.导入用户的数据

mongoimport -d test -c users --file 数据文件的路径

5.当用户访问/list时,将所有用户信息查询出来

5.1 实现路由功能,利用 request对象的method来判断是什么请求,然后拿到请求的path路径,根据不同的path路径来实现不同的功能逻辑,

5.2 如果是list,查询用户信息,然后遍历用户数据,拼接获取的数据,渲染到页面

5.3 如果是add,跳转到添加页面

5.4 如果是modify,跳转到用户修改页面,根据用户id查询出用户的所有信息,显示在页面

5.4 如果是remove,根据用户的id,来删除这条数据,然后重新挑换到list页面

5.5 如果是post请求,路径是add,说明用户点击了提交,需要获取用户信息,然后插入到数据库

5.6 如果是post请求,路径是modify,说明用户点击了修改,需要拿到信息,根据用户id来修改数据库里面的数据

// 为服务器对象添加请求事件
app.on('request', async (req, res) => {
	// 请求方式
	const method = req.method;
	// 请求地址
	const { pathname, query } = url.parse(req.url, true);

	if (method == 'GET') {
		// 呈现用户列表页面
		if (pathname == '/list') {
            // 查询用户信息
			let users = await User.find();
            // html字符串,拼接html的内容
			let list ='<!DOCTYPE html>
				<html lang="en">
				<head>
					<meta charset="UTF-8">
					<title>用户列表</title>
					<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css">
				</head>
				<body>
					<div class="container">
						<h6>
							<a href="/add" class="btn btn-primary">添加用户</a>
						</h6>
						<table class="table table-striped table-bordered">
							<tr>
								<td>用户名</td>
								<td>年龄</td>
								<td>爱好</td>
								<td>邮箱</td>
								<td>操作</td>
							</tr>';
            //拿到了用户的信息,用户的信息可能不只一条,所以我们需要去遍历用户信息来拼接里面的内容
            	users.forEach(item => {
				list += `
					<tr>
						<td>${item.name}</td>
						<td>${item.age}</td>
						<td>
				`;
                //一个用户会有多个爱好,所以需要进行遍历
				item.hobbies.forEach(item => {
					list += `<span>${item}</span>`;
				})

				list += `</td>
						<td>${item.email}</td>
						<td>
							<a href="/remove?id=${item._id}" class="btn btn-danger btn-xs">删除</a>
							<a href="/modify?id=${item._id}" class="btn btn-success btn-xs">修改</a>
						</td>
					</tr>`;
			});
            //拼接HTML页面剩余的标签
            list += `
						</table>
					</div>
				</body>
				</html>
			`;
            //代码执行到这里,所有的数据已经拼接完毕,需要返回给页面
            res.end(list);
       }else if (pathname == '/add') {
		// 呈现添加用户表单页面
        let add = `
				<!DOCTYPE html>
				<html lang="en">
				<head>
					<meta charset="UTF-8">
					<title>用户列表</title>
					<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css">
				</head>
				<body>
					<div class="container">
						<h3>添加用户</h3>
						<form method="post" action="/add">
						  <div class="form-group">
						    <label>用户名</label>
						    <input name="name" type="text" class="form-control" placeholder="请填写用户名">
						  </div>
						  <div class="form-group">
						    <label>密码</label>
						    <input name="password" type="password" class="form-control" placeholder="请输入密码">
						  </div>
						  <div class="form-group">
						    <label>年龄</label>
						    <input name="age" type="text" class="form-control" placeholder="请填写邮箱">
						  </div>
						  <div class="form-group">
						    <label>邮箱</label>
						    <input name="email" type="email" class="form-control" placeholder="请填写邮箱">
						  </div>
						  <div class="form-group">
						    <label>请选择爱好</label>
						    <div>
						    	<label class="checkbox-inline">
						    	  <input type="checkbox" value="足球" name="hobbies"> 足球
						    	</label>
						    	<label class="checkbox-inline">
						    	  <input type="checkbox" value="篮球" name="hobbies"> 篮球
						    	</label>
						    	<label class="checkbox-inline">
						    	  <input type="checkbox" value="橄榄球" name="hobbies"> 橄榄球
						    	</label>
						    	<label class="checkbox-inline">
						    	  <input type="checkbox" value="敲代码" name="hobbies"> 敲代码
						    	</label>
						    	<label class="checkbox-inline">
						    	  <input type="checkbox" value="抽烟" name="hobbies"> 抽烟
						    	</label>
						    	<label class="checkbox-inline">
						    	  <input type="checkbox" value="喝酒" name="hobbies"> 喝酒
						    	</label>
						    	<label class="checkbox-inline">
						    	  <input type="checkbox" value="烫头" name="hobbies"> 烫头
						    	</label>
						    </div>
						  </div>
						  <button type="submit" class="btn btn-primary">添加用户</button>
						</form>
					</div>
				</body>
				</html>
			`;
		res.end(add);
      }else if (pathname == '/modify') {
        //如果是修改页面,呈现修改的页面,修改肯定是修改某一个用户的信息,需要根据用户的id来进行查询
		let user = await User.findOne({_id: query.id});
		let hobbies = ['足球', '篮球', '橄榄球', '敲代码', '抽烟', '喝酒', '烫头', '吃饭', '睡觉', '打豆豆']
		console.log(user)
		// 呈现修改用户表单页面
		let modify = `
				<!DOCTYPE html>
				<html lang="en">
				<head>
					<meta charset="UTF-8">
					<title>用户列表</title>
					<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css">
				</head>
				<body>
					<div class="container">
						<h3>修改用户</h3>
						<form method="post" action="/modify?id=${user._id}">
						  <div class="form-group">
						    <label>用户名</label>
						    <input value="${user.name}" name="name" type="text" class="form-control" placeholder="请填写用户名">
						  </div>
						  <div class="form-group">
						    <label>密码</label>
						    <input value="${user.password}" name="password" type="password" class="form-control" placeholder="请输入密码">
						  </div>
						  <div class="form-group">
						    <label>年龄</label>
						    <input value="${user.age}" name="age" type="text" class="form-control" placeholder="请填写邮箱">
						  </div>
						  <div class="form-group">
						    <label>邮箱</label>
						    <input value="${user.email}" name="email" type="email" class="form-control" placeholder="请填写邮箱">
						  </div>
						  <div class="form-group">
						    <label>请选择爱好</label>
						    <div>
						    	
						    
			`;

			hobbies.forEach(item => {
				// 判断当前循环项在不在用户的爱好数据组
				let isHobby = user.hobbies.includes(item);
				if (isHobby) {
					modify += `
						<label class="checkbox-inline">
						  <input type="checkbox" value="${item}" name="hobbies" checked> ${item}
						</label>
					`
				}else {
					modify += `
						<label class="checkbox-inline">
						  <input type="checkbox" value="${item}" name="hobbies"> ${item}
						</label>
					`
				}
			})

			modify += `
						    </div>
						  </div>
						  <button type="submit" class="btn btn-primary">修改用户</button>
						</form>
					</div>
				</body>
				</html>
			`;
		res.end(modify);   
      }else if (pathname == '/remove') {
            //删除根据用户id进行删除
			await User.findOneAndDelete({_id: query.id});
            //通过301的相应码进行重定向
			res.writeHead(301, {
				Location: '/list'
			});
			res.end();
		}
	}else if (method == 'POST') {
       // 用户添加功能
		if (pathname == '/add') {
			// 接受用户提交的信息
			let formData = '';
			// 接受post参数,这是一个持续的过程,我们不知道什么时候传递好了,需要在end里面去进行监听
			req.on('data', param => {
				formData += param;
			})
			// post参数接受完毕
			req.on('end', async () => {
                //利用 querystring来进行数据的解析
				let user = querystring.parse(formData)
				// 将用户提交的信息添加到数据库中
				await User.create(user);
				// 301代表重定向
				// location 跳转地址
				res.writeHead(301, {
					Location: '/list'
				});
				res.end();
			})
		}else if (pathname == '/modify') {
			// 接受用户提交的信息
			let formData = '';
			// 接受post参数
			req.on('data', param => {
				formData += param;
			})
			// post参数接受完毕
			req.on('end', async () => {
				let user = querystring.parse(formData)
				// 将用户提交的信息添加到数据库中
				await User.updateOne({_id: query.id}, user);
				// 301代表重定向
				// location 跳转地址
				res.writeHead(301, {
					Location: '/list'
				});
				res.end();
			})
		}
	}

});
// 监听端口
app.listen(3000);

相关模块方法

url模块

专门用来处理请求路径相关

url.parse(urlString,boolean,boolean)

parse这个方法可以将一个url的字符串解析并返回一个url的对象

urlString 传入一个url地址的字符串

第二个参数(可省):如果设为 true,则返回的 URL 对象的 query 属性会是一个使用 querystring 模块的 parse() 生成的对象。 如果设为 false,则 query 会是一个未解析未解码的字符串。 默认为 false。

例如:

[外链图片转存失败(img-RgP15J2Y-1568473363881)(images/url-true.png)]

第三个参数(可省):如果设为 true,则 // 之后至下一个 / 之前的字符串会解析作为 host。 例如, //foo/bar 会解析为 {host: 'foo', pathname: '/bar'} 而不是 {pathname: '//foo/bar'}。 默认为 false。

url.format(urlObj)

format这个方法是将传入的url对象编程一个url字符串并返回

url.format({
    protocol:"http:",
    host:"182.163.0:60",
    port:"60"
});
/*
返回值:
'http://182.163.0:60'
*/

url.resolve(from, to)

resolve这个方法返回一个格式为"from/to"的字符串,把参数进行一个拼接,然后返回

const url = require('url');
url.resolve('/one/two/three', 'four');         // '/one/two/four'
url.resolve('http://example.com/', '/one');    // 'http://example.com/one'
url.resolve('http://example.com/one', '/two'); // 'http://example.com/two'

querystring模块

querystring从字面上的意思就是查询字符串,一般是对http请求所带的数据进行解析

querystring.parse(str,separator,eq,options)

parse这个方法是将一个字符串反序列化为一个对象。

str:指需要反序列化的字符串;

separator(可省):指用于分割str这个字符串的字符或字符串,默认值为"&";

eq(可省):指用于划分键和值的字符或字符串,默认值为"=";

decodeURIComponent:传入一个function,用于对含有%的字符串进行解码,默认值为querystring.unescape,默认是utf-8的编码,如果不是需要进行定义

// 假设 gbkDecodeURIComponent 函数已存在。

querystring.parse('w=%D6%D0%CE%C4&foo=bar', null, null,
                  { decodeURIComponent: gbkDecodeURIComponent });

querystring.stringify(obj,separator,eq,options)

stringify这个方法是将一个对象序列化成一个字符串,与querystring.parse相对。

obj:指需要序列化的对象

separator(可省):用于连接键值对的字符或字符串,默认值为"&";

eq(可省):用于连接键和值的字符或字符串,默认值为"=";

options(可省):传入一个对象,该对象可设置encodeURIComponent这个属性:

encodeURIComponent:值的类型为function,可以将一个不安全的url字符串转换成百分比的形式,默认值为querystring.escape()。

querystring.stringify({name: 'heima', sex: [ 'man', 'women' ] });
/*
return:
'name=heima&sex=man&sex=women'
*/

querystring.escape(str)

escape可使传入的字符串进行编码

querystring.escape("name=黑马程序员");
/*
return:
'name%3D%E9%BB%91%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%91%98'
*/

querystring.unescape(str)

unescape方法可将含有%的字符串进行解码

querystring.unescape('name%3D%E9%BB%91%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%91%98');
/*
return:
'name=黑马程序员'
*/
【数据集】2000-2018年中国城市不透水面数据集CLUD-Urban 城市不透水面数据集CLUD-Urban 阅读详情

相关推荐

GEE | 1985—2024年中国30米土地利用CLCD数据

中国年度土地覆盖数据集(CLCD)研究团队利用Google Earth Engine平台处理了335,709幅Landsat影像,构建了1985-2024年中国首套Landsat年度土地覆盖产品。该数据集结合中国土地利用/覆盖数据集(CLUD)样本和人工解译样本,采用随机森林分类器,并通过时空滤波和逻辑推理后处理方法提高数据一致性。2024年版本已改用Landsat Collection2 SR数据,采用云优化GeoTIFF格式以提高处理效率。完整数据集可通过Zenodo获取

国科大硕士在读,分享Python/GEE/Matlab/R专业代码实践,涵盖数据分析、算法开发与应用技巧等,以代码会友。 1550

数据库概念&mongodb使用&数据库CLUD操作

数据库概念&amp;环境搭建 目标 能够安装数据库软件 能够知道集合、文档的概念 能够使用mongoose创建集合的方法创建集合 为什么要使用数据库(★★★) 动态网站中的数据都是存储在数据库中的 数据库可以用来持久存储客户端通过表单收集的用户信息 数据库软件本身可以对数据进行高效的管理 什么是数据库(★★★) 数据库即存储数据的仓库,可以将数据进行有序的分门别类的存储。它是独立于语言之...

码化疼 521

typeorm实战之findOne()方法

1.简介 findOne()方法是查找数据库中的一条记录 /** * Finds first entity that matches given options. */ findOne(id?: string | number | Date | ObjectID, options?: FindOneOptions&lt;Entity&gt;): Promise&lt;Entity | undefined&gt;; /** * Finds...

蛐蛐的博客 4761

uniclound:对云数据库的MongoDB操作

首先我们先定义uniClound const db = uniCloud.database() const dbCmd = db.command 1.添加 其中'video'为uniclound的数据库名称add里面的为添加的数据。 db.collection('video').add({ 'name': '123', 'url':[123], 'year':124 }) 2.查询 使用get获取所有数据 db.collection('video').get(.

wang_9909的博客 1412

Node.js Mongodb 密码特殊字符 @的解决方法

在去年的 DB 勒索事件之后, 不少的同学开始加强 Mongodb 的安全性, 其中一种办法就是设置复杂的密码. 那么如果设置的密码里包含一些如 &ldquo;@&rdquo;, &ldquo;:&rdquo; 一样的特殊字符,怎么处理呢?下面小编给大家带来了Node.js Mongodb 密码特殊字符 @的解决方法,一起学习吧

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

你可以 CRUD,但你不是 CRUD 程序员!

什么是务实 务实程序员他们总是在面临问题时,透过问题看到本质,从具体的场景出发,从大局着想,了解整个问题的来龙去脉,他们会对自己的行为负责,在项目面临问题时,他们不会撒手不管或者任由风险一步步扩大直至无法维护。 大多数人都不是务实的程序员,因为成为务实的程序员并不满足短期的利益,需要长期的打磨和持续不断的学习、思考反思。大多数人不是务实的程序员的原因只有一个:惰性使然。 程序员是有戾气的,许多人向我抱怨 工作很久了,年龄也比较大了,感觉工作这些年以来在技术方向上没什么提升 对这些人我有话说:没.

qq_43080036的博客 5692

通过JLink下载实现工控MCU批量烧录实战案例

利用JLink下载工具实现高效稳定的工控MCU批量烧录,提升产线效率。案例详细解析了脚本配置与自动化流程,突出jlink下载的可靠性和可扩展性,适用于大规模嵌入式部署场景。

weixin_30205153的博客 814

mongodb 数据库 创建 schema 模块化(3)

// 模型 user.js (模块化) var mongoose = require('mongoose ') var Schema = mongoose.Schema; var userSchema = new Schema({ name:String, age:Number, gender:{ type:String, default:'fem...

小马哥的天涯 1420

无人机避障——感知篇(采用Mid360复现Fast-lio)

本文介绍了在Ubuntu 18.04和ROS Melodic环境下,使用Xavier-nx电脑和Livox Mid-360激光雷达编译和运行FAST-LIO工程的步骤,包括创建工作空间、编译驱动和FAST-LIO源码,以及运行launch文件进行建图的过程。

weixin_45390670的博客 3546

吃透Chisel语言.04.Chisel基础(一)——信号类型和常量

开始肯定是介绍Chisel的基础内容了,《Chisel基础》这一部分主要会介绍数字设计中的两个基本组件:组合电路和触发器。这俩基本组件都不复杂,但是组合在一起就可以得到规模很大、功能也很强大的数字电路了。 第一部分我们就简单地看看Chisel中的信号类型和常量,在上一篇文章中也有相关介绍,其中还包括和Verilog之间的对比。......

github-3rr0r的博客 3822

mongodb 可是化_MongoDB 可视化管理工具

正文该项目从2011年10月开始开发,知道现在已经有整整5年了。MongoDB也从一开始的大红大紫到现在趋于平淡。MongoCola这个工具在一开始定位的时候只是一个Windows版本的工具,期间也想改为WebPage版本,但是只是开了一个头,也没有继续下去。现在想想,可能这个决定是正确的,WebPage版本是为了跨平台才去做的,但是,当时的环境,Net Core并没有发布,即使用MVC5搭建平台...

weixin_42561464的博客 929

永磁同步电机MTPA控制详解:从理论到实践的全方位指南

永磁同步电机(PMSM)凭借其高功率密度卓越的效率以及精准的控制性能,已在工业驱动、电动汽车和家用电器等领域获得广泛应用。而在PMSM的诸多控制策略中,最大转矩电流比(MTPA)控制因其能显著提升电机效率而占据核心地位。在输出特定转矩时,通过优化直轴电流(Id)和交轴电流(Iq)的分配,使定子电流的幅值最小化。对于电机测试工程师而言,理解MTPA意味着掌握了一把提升系统性能的关键钥匙。为什么这一点如此重要?因为定子电流的减小直接带来了铜损的降低。

优快云-新能源汽车研发测试专业博主 518

mongoose 查询数据属性为数组,且包含某个值的方法

mongoose在创建schema的时候有些属性需要设置为数组类型,比如商品图片、商品标签、不同尺寸、价格等。 那么怎么查询具有某个标签的商品了,下面记录一下两种情况: 查询具有‘vue’标签的文章 1、数组中存储的是字符串元素 下面以个人博客数据来说明 -数据(labels 值为字符串数组) [ { labels: ["vue","react","mongoose"], likeCount: 0, lookCount: 0, name: "手动封装一个渐变色进度条",

weixin_40305713的博客 4689

STM32步进电机控制三大方案:GPIO/定时器/PWM深度对比

步进电机控制是嵌入式运动控制的基础技术,其核心在于精确生成脉冲(PUL)、方向(DIR)和使能(EN)三路数字信号。原理上,脉冲频率决定转速,脉冲数量决定位置,方向电平决定转向,而使能时序保障驱动器可靠启停。该技术具有高定位精度、开环稳定性与低成本优势,广泛应用于3D打印机、CNC设备、自动化产线等场景。在STM32平台实现时,需兼顾硬件隔离设计(如6N137光耦)、HAL库抽象封装及实时性约束。本文围绕GPIO模拟、定时器中断与PWM比较输出三种主流方法,系统剖析其时序机制、CPU开销、抗干扰能力与工业适

weixin_35755640的博客 87

【机器学习】随机森林(Random Forest,简称 RF):预测光伏电站功率 || 缺失数据处理 || 重复行处理...

【机器学习】随机森林(Random Forest,简称 RF):预测光伏电站功率。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1648

前后端交互(二)——MongoDB + artTemplate + Express

一.MongoDB 数据库 1.数据库概述及环境搭建 使用数据库原因: 动态网站中的数据都是存储在数据库中的 数据库可以 持久存储 客户端通过表单收集的用户信息 数据库软件本身可以对数据进行高效管理 MongoDB可视化软件:是使用 图形界面操作数据库 的一种方式 数据库软件可以包含多个数据仓库,每个数据仓库 中包含多个数据集合,每个 数据集合 中包含多条 文档 使用...

Lyrelion的博客 948

【八股】JUC并发编程篇

👉抽象队列同步器,就是一种锁,内部维护的是一个先进先出的双向队列,队列中存储的是排队的线程,用state来标识是否有线程获得锁【0是无锁状态】👉流程:当一个线程拿到锁后会修改state = 1,这时如果有其他线程访问则会进入队列进行排序,直到state变成0后,队头线程才会拿到锁。在对state进行修改时,用的是CAS操作,所以可以保证原子性。👉它可以实现公平锁或非公平锁【默认】,上述是一个公平锁。如果新线程和队头线程抢锁资源就是非公平锁。

qq_44768318的博客 552

最好用的mongodb可视化工具

TreeSoft数据库管理系统,采用web方式,对mongoDB进行管理维护,一次布署,到处使用, 功能包括:mongoDB数据的查看,新增,编辑,删除,shell命令的执行,树状展示,数据导出JSON, 数据JSON格式化输出,状态参数监控,在线配置维护数据源,数据同步,数据可视化,皮肤配色设置等,更多功能等待你的发掘。 可支持 MySQL,Oracle,PostgreSQL, SQL S...

weixin_34087503的博客 211

CAPL未来发展方向展望

通过本文的学习,读者应该对CAPL的未来发展方向有了初步的了解。随着汽车电子系统的不断发展,CAPL也在不断演进,以支持更多的技术和应用场景。希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1183

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

mongoose数据库概述及环境搭建

1.数据库相关概念 在一个数据库软件中可以包括多个数据仓库,在每个数据仓库中可以包含多个数据集合,每个数据集合中可以包含多条文档(具体的数据)。 术语 解释说明 database 数据库,MongoDB数据库软件中可以建立多个数据库 collection(表) 集合,一组数据的集合,可以理解为javaScript中的数组 document(数据) 文档,一条具体的数据,可以理解为javaScript中的对象 field 字段,文档中的属性名称,可以理解为JavaScript中的对

m0_53956340的博客 573

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

mongoose验证规则(3)

// 引入mongoose第三方模块 用来操作数据库 const mongoose = require('mongoose'); // 数据库连接 mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true}) // 连接成功 .then(() =&gt; console.log('数据库连接成功')) // 连接失败 .catch(err =&gt; console.log(err, '数据库连接失败')).

weixin_45147894的博客 306

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

098node-第三方模块mongoose创建集合规则生成实例+增删改查

先引入mongoose连接数据库 const mongoose = require('mongoose'); // 使用mongoose提供的connect方法即可连接数据库 mongoose.connect('mongodb://localhost/playground', { useUnifiedTopology: true, useNewUrlParser: true }) .then(() =&gt; console.log('连接成功')) .catch(err =&gt; c.

Gy_9543的博客 474

MongoDB字段创建验证

前期准备 const mongoose = require('mongoose') //创建集合结构(规则) options集合的结构(规则) const Schema = mongoose.Schema //modalName集合名称schema集合结构 //const Model = mongoose.model(modelName, schema) //连接数据库 mongoose.connect('mongodb://localhost/test', { useNewUrlParser:

qq_41915936的博客 487

数据库(mongoDB)概述及环境搭建

动态网站中的数据都是存储在数据库中的。 数据库可以用来持久存储客户端通过表单收集的用户信息 数据库软件本身可以对数据进行高效的管理。 数据库 数据库是存储数据的仓库,可以将数据进行有序的分们别类的存储,它是独立于语言之外的软件,可以通过API去操作它。 数据库相关概念 在一个数据库软件中可以包含多个数据仓库,在每个数据中可以包含多个数据集合,每个数据集合中可以包含多条文档(具体的数据) ...

Mia的博客 296

flutter中的json转对象

Flutter中的json转对象以下我自己解析json内容生成对象json格式如下生成结果备注说明 网上有好多json转对象的方法: 在线生成的:https://javiercbk.github.io/json_to_dart/ 弊端:每次都要打开网页去生成,尤其是公司网不好的时候,急死; 插件生成的:插件名:FlutterJsonBeanFactory 弊端:不知道没弄明白还是根本没法设置,我只想要一个简单的文件,不要什么继承. 因为子类型总是重复生成. 以下我自己解析json内容生成对象 只涉及到自己用

郗瑞强的专栏 2152
上一篇: day04-artTemplate&学生档案系统&router&serveStatic
下一篇: 静态仔的挣扎第01天
Smart_coding
博客等级 码龄7年 21粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值