复杂值工程化 具体见day18/note文件夹

有如下数据:

  1. 用户:

    {loginId:"账号", //必填,唯一(索引),长度3-18,去除前后空格loginPwd:"密码",//必填,去除前后空格,查询时不显示name:"姓名",//必填,去除前后空格,长度2-10age:18,//数字,默认值18loves: ["爱好"],//数组,默认空数组address: { //必填province: "省份",city: "城市"}
    }
  2. 用户操作:

    {operation: "登录",//必填,索引,去除前后空格,值只能在["登录", "注销", "发布文章", "发布评论", "阅读文章"]中选择time: 日期,//Date类型,默认值当前时间userid: 用户的id,//关联用户的idextraInfo: 任意对象, // 操作额外的对象,默认值空对象address: { // 必填,操作的地址province: "省份",city: "城市"}
    }

    整体结构

1、由于两个数据都对地址有一样的要求,所以需要把地址单独模块化,然后直接引入。

/* 引入文件 */
const mongo=require('mongoose');
​
/* 数据格式 */const ressSchema=new mongo.Schema({province:{type:String,//字符串类型required:true,//必填},city:{type:String,required:true,} });
​/* 暴露出数据 */module.exports=ressSchema;

2、用户信息格式模块化,后面直接引用。

/* 引入文件 */
let mongo=require('mongoose');
let address=require('./address(用户地址格式).js');
​
/* 数据格式 */
const uesrInfo=new mongo.Schema({loginId:{type:String,required:true,//必填index:true,//索引,类似于目录unique:true,//唯一性minlength:1,//最小长度maxlength:18,//最大长度trim:true,//去除左右空格},loginPwd:{type:String,required:true,//必填trim:true,//去除左右空格  select:false,//查询不显示},name:{type:String,required:true,//必填minlength:2,//最小长度maxlength:10,//最大长度trim:true,//去除左右空格 },age:{type:Number,default:18,},loves:{type:[String],//数组类型default:[],  //默认空数组},address:{type:address,//引用格式required:true,}});
​/* 创建数据模型
1:数据模型名称
2:数据结构
3:数据模型对应的数据库中的数据集合名称*/
let usersModel=mongo.model('usersModel',uesrInfo,'uesrInfo');//第三个参数是一个数据库里面的集合
​/* 暴露出数据 */module.exports=usersModel;

3、设置用户操作的范围,只能是其中一个。

module.exports = ["登录", "注销", "发布文章", "发布评论", "阅读文章"];

4、创建用户操作模块,其中需要注意userId和生成用户自动添加的Id一样,便于可以知道是谁在操作,其中enum是之前设置操作范围,选其一。

/* 引入文件 */
let mongo=require('mongoose');
let address=require('./address(用户地址格式)');
let functions=require('./function(功能)');
/* 数据格式 */
const useropt=new mongo.Schema({operation:{type:String,required:true,trim:true,enum:functions,//功能选1},time:{type:Date,default:Date.now,//默认当前时间},userid:{type:mongo.Types.ObjectId,//和用户信息表关联,知道每一次操作是谁在操作required:true,ref:"usersModel" ,//要进行关联查询是引入关联的usersModel的名字,该名字是导出model的第一个参数的名字,要一致},extraInfo:{type: Object,default: {}, }, //任意对象,address: { // 必填,操作的地址type: address,required:true,}   });
​/* 创建数据模型
1:数据模型名称
2:数据结构
3:数据模型对应的数据库中的数据集合名称*/
let usersoptModel=mongo.model('usersoptModel',useropt,'uesropt');//第三个参数是一个数据库里面的集合
​
/* 暴露出数据 */
module.exports=usersoptModel;

5、与数据库建立连接。

/* 引入文件 */
let mongo=require('mongoose');
​
/* 连接数据库 */
mongo.connect('mongodb://127.0.0.1/stus',{useNewUrlParser: true,//为可选参数,也是之前老版本去除警告需要的参数useUnifiedTopology: true,
});
​
/* 连接成功后执行打印 */
mongo.connection.on('connected',()=>{console.log('已和数据库连接!');
});

6、把以上的功能合并在一起并暴露出去,方便入口文件或者其他模块使用。

/* 导入文件 */
require('./create(连接).js');
let userInfo = require("./userInfo(用户信息)");
let useropt = require("./useropt(用户操作)");
​
/* 暴露出去 */
module.exports.userInfo = userInfo;
module.exports. useropt = useropt;

7、由于入口文件外部index.js只进行简单的传值调用,所以需要单独把增删查改方法进行封装-对用户信息进行操作。

let {userInfo,useropt} = require("../modules/index(统一合并导出).js");
​
/* 查找方法 */
async function find(){let result = await userInfo.find();return result;
}
​
/* 通过Id查找用户 */
async function findUser(id){let result = await userInfo.findById(id);return result;
}
​
/* 模糊查询,通过条件查询 skip(0)里面的值就是代表跳过几个 */
/*** 按条件分页查询数据,如果filter提交为空,则查询所有数据* @param {Object} filter 查询条件* @param {Number} page 当前页* @param {Number} limit 每页显示的数量* @returns */
async function query(filter,page ,limit=5){//分页公式 (page-1)*limitlet result = await userInfo.find(filter).skip((page-1)*limit).limit(limit);//表示只出现0-5条数据,后面得值是页面固定的条数return result;
}
​
​
/* 添加 */
async function addUser(user){let result = await userInfo.create(user);return result;
}
/* 添加多个 */
async function addUsers(users){let result = await userInfo.insertMany(users);return result;
}
​
/* 修改 */
async function updateUser(id,user){let result = await userInfo.update({_id:id},user);return result;
}
​
/* 删除 */
async function deleteUser(id){let result = await userInfo.remove({_id:id});return result;
}
​
module.exports.find = find;
module.exports.findUser = findUser;
module.exports.addUser = addUser;
module.exports.updateUser = updateUser;
module.exports.deleteUser = deleteUser;
module.exports.query = query;
module.exports.addUsers= addUsers;
​

8、由于入口文件外部index.js只进行简单的传值调用,所以需要单独把增删查改方法进行封装-对用户操作进行操作。

let {userInfo,useropt} = require("../modules/index(统一合并导出).js");
​
/*** 查询所有操作记录并显示操作人信息* @returns {Promise<*>} 操作记录*/
async function query(){let result = await useropt.find().populate("userid","loginId name");//populate("userid","loginId name")通过Id把用户信息显示,第二个参数可以指定显示哪一些,不写就是全部显示return result;
}
​
/* 暴露 */
module.exports.query = query;

9、也可使用mock直接批量生成数据并传入数据库。

let Mock = require("../node_modules/mock/mock.js");
const { pick } = require("../modules/address(用户地址格式).js");
let users = Mock.mock({"datas|20-25": [{"loginId": /[A-Za-z0-9_]{3,9}/,//正则"loginPwd": "@word(3,9)","name": "@cname","age|18-30": 1,"loves|1-4":['@pick(["电影","阅读","旅游","游戏","运动","购物"])'],"address": {"province": "@province","city": "@city",}}]
}).datas;
​
/* 暴露数据 */
module.exports = users;

10、入口文件直接进行调用操作。

// let {userInfo,useropt} = require("./modules/index(统一合并导出).js");
let mongo=require('mongoose');
let Dao=require("../note/userDao(增删查改操作)/dao.js");//直接使用方法
let optDao=require("../note/userDao(增删查改操作)/optDao.js");//直接使用方法
let Date=require("./mock/usersMock.js");//引入数据
​
​
/* 批量添加 使用mock生成的数据批量导入*/
​
Dao.addUsers(Date).then((data) => {console.log(data);});
​
/* 用户操作部分 useropt*/
​
optDao.query({}).then((data) => {console.log(data);
}
);
​
​
​
/* 新加用户 */
// let user = new userInfo({
//     loginId:"15",
//     loginPwd:"123466",
//     name:"赵鑫勇",
//     age:18,
//     loves:["阅读","游戏"],
//     address:{
//         province:"四川",
//         city:"成都"
//     }
// });
​
// user.save((err,data)=>{
//     if(err) throw err;
//     console.log(data);
// });
​
/* 新加操作 */
// async function add() {
//     let obj = {
//         operation:"登录",
//         userid:mongo.Types.ObjectId("62450e58b83caa72ee5dbf68"),
//         address:{
//             province:"四川",
//             city:"成都"
//         }
//     };
//     await useropt.create(obj);
//   }
//  add();
​
​
/* 用户操作部分 useropt*/
​
//查询所有用户
Dao.find().then(data=>{console.log(data);
});
​
​
//根据id查询某个用户
Dao.findUser("6245125aacff32bda3d8c04b").then(data=>{console.log(data);
});
​
//根据id删除某个用户
Dao.deleteUser("62450e34ca786b221c071332").then(data=>{console.log(data);
})
​
/* 修改 */
Dao.updateUser("6245125aacff32bda3d8c04b",{name:"张三思2222",age:23,loves:["旅游"],address:{province:"四川",city:"绵阳"}}).then(data=>{console.log(data);})
​
​
/* 新增 */
Dao.addUser({name: "赵思",loginId: "zhangisi",loginPwd: "123456",age: 23,loves: ["旅游"],address: {province: "四川",city: "绵阳",},}).then((data) => {console.log(data);});
​
/* 模糊查询 */
Dao.query({ name: { $regex: "张" } }).then((data) => {console.log(data);});
												

JavaScript mongodb(数据库)复杂值相关推荐

  1. python操作mongodb数据库

    2019独角兽企业重金招聘Python工程师标准>>> 一.MongoDB 数据库操作 连接数据库 import pymongo conn = pymongo.Connection( ...

  2. 58 Node.js中操作mongoDB数据库

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder 的程序人生 1.数据库概述及环境搭建 1.1 为什么要使用数据库 动态网站中的数据都是存储在数据 ...

  3. 关于MongoDB数据库的总结

    既然要说MongoDB数据库,先引入NoSQL的概念. NoSQL: NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系 ...

  4. 前端笔记之NodeJS(四)MongoDB数据库Mongoose自制接口MVC架构思想|实战

    一.MongoDB数据库 1.1 NoSQL简介 随着互联网web2.0网站的兴起,传统的SQL数据库(关系数据库)在应付web2.0网站,特别是超大规模和高并发的SNS(social network ...

  5. Mongodb数据库初识

    Mongodb数据库初识 一.什么是数据库 1.标准定义 2.数据库的概念 3.数据库的简单理解 4.使用数据库的原因 ①普通文件系统存储大量数据的问题 ②数据库的高效性 二.数据库的分类 1.关系型 ...

  6. 浅析MongoDB数据库的海量数据存储应用

    [摘要]当今已进入大数据时代,特别是大规模互联网web2.0应用不断发展及云计算所需要的海量存储和海量计算发展,传统的关系型数据库已无法满足这方面的需求.随着NoSQL数据库的不断发展和成熟,可以较好 ...

  7. MongoDB数据库(了解MongoDB及基础命令,备份数据库)

    文章目录 MongoDB数据库(了解MongDB及基础命令,备份数据库) 什么是MongoDB ? 主要特点 配置mongdb数据库 多实例配置 数据库操作 备份数据库 MongoDB数据库(了解Mo ...

  8. MongoDB数据库基本操作笔记

    为了保存网站的用户数据和业务数据,通常需要一个数据库.MongoDB和Node.js特别般配,因为Mongodb是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改 ...

  9. mongodb数据库显示obj_Mongodb使用

    1.下载安装 1.1.首先去官网下载mongodb对应版本安装 https://www.mongodb.com/download-center 解压到目录 例如:c:/mongo 创建文件夹用于mon ...

  10. python数据存储系列教程——python中mongodb数据库操作:连接、增删查改、多级路径

    全栈工程师开发手册 (作者:陈玓玏) python教程全解 调试环境python3.6,调试python操作mongodb数据库,首先要在本地或服务器安装mongodb数据库.安装参考:http:// ...

最新文章

  1. Clojure世界:单元测试
  2. python找出函数最小值极其对应的自变量的值
  3. python开发小型数据库_Python开发【第十七篇】:MySQL(一)
  4. 发现在创建云服务器ecs实例的磁盘快照时_玩转ECS第7讲|ECS数据保护-数据备份新特性与最佳实践...
  5. Android之通过Binder机制实现IPC和linux的传统IPC的对比分析
  6. 使用Oracle Data Integrator(和Kafka / MapR流)完善Lambda体系结构
  7. thread.sleep是让哪个线程休眠_Java多线程:多线程基础知识
  8. 谷歌浏览器flash崩溃怎么办 Google Chrome flash崩溃解决方法
  9. 课程目标IO java
  10. php相册上传和删除吗,php上传与删除图片的简单范例
  11. 2.React学习笔记----修改模板并使用Ant Design
  12. Windows 10 安装 IIS 管理器
  13. MAXIMO部分AppBean类操作经验
  14. Unity 2D教程 | 骨骼动画:创建动画
  15. 小程序公众号的微信支付0.2%费率商户号是怎么降低的?
  16. ora-01031解决方法
  17. 速度最快的数据库---MEMSQL的安装与部署
  18. 详解人工智能领域重大突破:GPT-3
  19. 多模态视觉任务Video Grounding介绍
  20. mongodb安装配置与基本命令

热门文章

  1. 教你羊肉炒菠菜的做法
  2. 帆布指纹识别(canvas fingerprinting)
  3. 云之讯手机号短信验证
  4. 机器学习入门要学习什么内容呢?
  5. 网游、链游、电子竞技是网络中的艺术吗?
  6. 计算机分子模拟聚乙烯,用“分子模拟”软件构建聚乙烯分子、全同立构聚丙烯分子,并计算它们末端的直线距离-高分子物理-实验1-01...
  7. 解决Windows 7下IE11无法卸载、无法重新安装,提示安装了更新的IE版本
  8. git clone no matching host key type found. Their offer: ssh-rsa,ssh-dss... 报错
  9. java改变字体_java字体设置
  10. 提升效率:优化Java代码的35个小技巧