JavaScript mongodb(数据库)复杂值

该博客介绍了在JavaScript中处理MongoDB数据库中复杂值的方法,包括地址和用户信息的模块化,用户操作的范围限制,数据库连接,以及增删查改操作的封装。通过这些步骤,可以更有效地管理和操作MongoDB数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

有如下数据:

  1. 用户:

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

  2. 用户操作:

    {
      operation: "登录",//必填,索引,去除前后空格,值只能在["登录", "注销", "发布文章", "发布评论", "阅读文章"]中选择
      time: 日期,//Date类型,默认值当前时间
      userid: 用户的id,//关联用户的id
      extraInfo: 任意对象, // 操作额外的对象,默认值空对象
      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)*limit
    let 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);
  });


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值