问题1:数据中多了‘’__v‘’字段

mongoose操作mongodb数据库发现文档中多了__v’字段
解决 : 只需要在Schema中,添加第二个对象 {versionKey: false }

  1. var OrderSchema = mongoose.Schema({
  2. order_id: Number,
  3. uid: Number,
  4. trade_no: String
  5. }, {versionKey: false})

问题2 : 运行脚本,提示

解决,把提示的,添加在建立数据连接的地方

useNewUrlParser 这个属性会在url 里面识别验证用户所需的db , 未升级前是不需要指定的,升级到一定要指定
image.png
image.png

问题3 mongodb 的主键id(Object) 作为查询条件的方法

  1. const ObjectId = require('mongodb').ObjectId;
  2. let resLei = await cardLeiModelSchema.find({ soft_id:ObjectId(soft_id)}

问题4 关于从页面上获取的数据

请注意获取的数据,是否有空格,否者会导致,查询失败的情况
image.pngimage.png
image.png

问题5 给数据库创建用户

1.第一次打开cmd窗口并以授权方式进入了mondb
2.创建了数据库
这个时候,想要给这个数据库创建用户,则需要重启cdm窗口才能正常创建用户,否则会报错数据库未定义

问题6 关于mongodb聚合查询

聚合查询需要用agg 来执行 ,但是find 也是能使用聚合查询
find的第二个参数表示 要显示的字段 1为显示

  1. let resLei = await cardLeiModelSchema.find({ soft_id: soft_id },{card_name:1})

math条件project 要显示的字段 1为显示

  1. let resUserCardLei = await cardLeiModelSchema.aggregate([{ project: { card_name: 1 } } ])

问题7 mongoDB 删除数组中的对象

方法1 $pull

同时也支持条件为字符串的
card_name 是中文字符串 类型的

  1. var result = await cardLeiModelSchema.update(
  2. { soft_id: req.query.soft_id },
  3. { $pull: { "camilla": { card_name: req.query.card_name } } }
  4. )
  5. {
  6. _id: 5150a1199fac0e6910000002,
  7. name: 'some name,
  8. items: [
  9. {id: 23, name: 'item name 23'},
  10. {id: 24,name: 'item name 24'}
  11. ]
  12. }
  13. db.mycollection.update(
  14. {'_id': ObjectId("5150a1199fac0e6910000002")},
  15. { $pull: { "items" : { id: 23 } } }
  16. );

注意这里删除的方式用的是updateOne 更新的指令后附带$pull 组成的删除效果
更要注意的是状态的标识不同

  1. const result = await Back_agencyUser.updateOne({ devId: _id , devMail: email}, { $pull: { "agencyObject": { agent_id: agent_id, agent_email:agent_email } } })
  2. result.modifiedCount == 1 ? varMessage = "删除成功" : varMessage = "删除失败"
  3. console.log('删除状态:', result.modifiedCount)

image.png

方法2 $pop

image.png
-1 表示删除最前面 1 表示删除最后面

  1. await tokenApiModel.updateOne({ cardMi: card }, { $pop: { tokenArr: -1 } })
  2. // 打印
  3. aaa { n: 1, nModified: 1, ok: 1 }


需要删除tokenArr数组里的所有对象 使用 $pull

  1. await tokenApiModel.updateOne({ cardMi: card }, { $pull: { tokenArr: {} } })

问题8 mongoDB 增加数据(对象)到数组中

方法1 $addToSet

这种是前提有查询的条件的,才能 插入或者更新对象数据到数组中

  1. db.class.update({name: "class1"}, {$addToSet:{student:{name: "zhaoliu", age: 17}}});
  2. let aa={ soft_id: data.softIDs, card_name: data.cards_name, card_Limitation: data.cards_Limitation_name, remark: data.remarks_name, price: data.prices_name, is_valid: data.is_valid, create_date: dataItem }
  3. await cardLeiModelSchema.update({soft_id: data.softIDs},{$addToSet:{camilla:{ aa }}})

方法2 save()

//【开发者】增加 软件数据的接口 addSoft.js 备份==============================================================

  1. router.post('/IncreaseData2', async (req, res) => {//数据 表单 添加软件数据接口 弹出层
  2. let dataObj = { "code": 200, "msg": "ok" }
  3. let now = new Date();
  4. let dataItem = dateFormat(now, "yyyy-mm-dd' 'HH:MM:ss");
  5. let { soft_name, prefix, theendcap, toplander, equip, tryout, headerbeat_interval, camilo_length, software_anno } = req.body
  6. let { key, secret } = appkey('chenchen', 18);
  7. let data = await new softwareModelSchema({
  8. user_id: req.session.userinfo._id,//谁创建的的
  9. soft_name: soft_name,//软件名称
  10. soft_AppKey: key,//软件id =====
  11. soft_Secret: secret,//软件密码
  12. prefix: prefix,//前缀
  13. theendcap: theendcap,//多开上限
  14. toplander: toplander,//顶号登陆
  15. equip: equip,//设备绑定
  16. tryout: tryout,//是否试用
  17. tryout_interval: 10,//试用分钟
  18. tryout_item: '',//试用间隔
  19. headerbeat_interval: headerbeat_interval,//心跳最大间隔
  20. camilo_length: camilo_length,//卡密长度
  21. camilo_rule: '卡密规则',//卡密规则
  22. software_anno: software_anno,//卡密公告
  23. is_valid: '1',//状态
  24. create_date: dataItem,//添加时间
  25. update_date: '',//最近更新
  26. }).save(() => {
  27. console.log("添加成功");
  28. })
  1. //1.增加软件之后,获取该软件的本身id
  2. //2.关联软件id到 卡类理表 6种卡类 创建 数据
  3. let result = await softwareModelSchema.find({ 'soft_name': soft_name }, { _id: 1 })
  4. let soft_id = result[0]._id;
  5. //关联软件id到 卡类理表cardLei 创建6种卡类 数据
  6. if (result[0]._id != undefined || result[0]._id != "undefined") {
  7. var dataCard = [
  8. { soft_id: soft_id, card_name: "年卡", card_Limitation: 1, remark: '360天', price: 2, is_valid: 1, create_date: dataItem },
  9. { soft_id: soft_id, card_name: "季卡", card_Limitation: 1, remark: '120天', price: 2, is_valid: 1, create_date: dataItem },
  10. { soft_id: soft_id, card_name: "月卡", card_Limitation: 1, remark: '30天', price: 2, is_valid: 1, create_date: dataItem },
  11. { soft_id: soft_id, card_name: "周卡", card_Limitation: 1, remark: '7天', price: 2, is_valid: 1, create_date: dataItem },
  12. { soft_id: soft_id, card_name: "天卡", card_Limitation: 1, remark: '24小时', price: 2, is_valid: 1, create_date: dataItem },
  13. { soft_id: soft_id, card_name: "时卡", card_Limitation: 1, remark: '60分钟', price: 2, is_valid: 1, create_date: dataItem }
  14. ];
  15. for (let i = 0; i < dataCard.length; i++) {
  16. let addCard = await new cardLeiModelSchema(dataCard[i]).save()
  17. }
  18. }
  19. res.send(dataObj)
  20. })

问题9 mongoDB 新增数据(含对象数据)到数组中

  1. //model模型
  2. {
  3. "user": "",
  4. "tokenMd5": "",
  5. "tokenArr":[
  6. {"device_id"'':,"token": "" ,"lastItem": },
  7. ]
  8. }
  9. //这种数据需求
  10. {
  11. "user": "AI78omR16IUrjpl63k3E2",
  12. "tokenMd5": "0c939e8ad3156096fa21f7299538435f",
  13. "tokenArr":[
  14. {"device_id":1001,"token": "QUk3OG9tUjE2SVVyanBsNjNrM0UyIiwiZGV2aWNl" ,"lastItem": 1625885547},
  15. ]
  16. }

方法1_插入数据到数组中updateOne()


对象数据

  1. let dddd={ device_id: 10023, token: "11111d11d111", lastItem: 1124212121 }

属于更新,条件,找到对应的id

  1. let ddd = await tokenApiModel.updateOne({ _id: "60eac0657b65e13178caec3d" }, { $addToSet: { tokenArr: dddd }});

等同于上面一个语句

  1. let ddd = await tokenApiModel.updateOne({ _id: "60eac0657b65e13178caec3d" }, { $addToSet: { tokenArr: { device_id: 10023, token: "11111d11d111", lastItem: 1124212121 } } });

方法2_新建数据携带数组new()


对象数据,并携带了 字符串的数据

  1. let dddd = { device_id: 10023, token: "11111d11d111", lastItem: 1124212121 }
  2. let ddd = await new tokenApiModel({ card: card, tokenMd5: cj.tokenMd5, tokenArr: [dddd] }).save();
  3. let ddd = await new tokenApiModel({ card: card, tokenMd5: cj.tokenMd5, tokenArr: [{ device_id: 10023, token: "11111d11d111", lastItem: 1124212121 }] }).save();

问题10 mongoDB 修改数据(数组中对象里的字段值)

数据结构 $set

image.png

  1. //数据结构
  2. {
  3. "_id": "60ebfcd838cc6a36d0c8d9d1",
  4. "tokenArr": [
  5. {
  6. "device_id": "10001",
  7. "tokenMd5": "b9534402c5169bbd10e7f3b22cca3b3c",
  8. "token": "zUZA-iCYo6j7XK3NRSrETAVHa6iD2JKcKoH3kZq-i2Q",
  9. "lastItem": 1626078425
  10. },
  11. {
  12. "device_id": "10002",
  13. "tokenMd5": "cae5039b019e6f9cae2cd51e8fb60832",
  14. "token": "AAo_Fz_XCjA2gFzZqj3K_gMvzFDkX16oobYjcdE7ntQ",
  15. "lastItem": 1626079306
  16. }
  17. ],
  18. "lastItem": 1626078425,
  19. "cardMi": "utMY0G7mDe1ubXEY67J3B",
  20. "cardMd5": "b401319df5c6cd9283a3039d973d0464"
  21. }

修改语句

  1. //把用户最新的时间戳更新进去
  2. let aaaa = await tokenApiModel.updateMany({ cardMi: card ,"tokenArr.tokenMd5":{set: { "tokenArr.$.lastItem":cj.timeDate } });
  3. console.log("aaaa::", aaaa);
  4. //把用户最新的时间戳更新进去
  5. let aaaa = await tokenApiModel.updateMany({ cardMi: card ,"tokenArr.tokenMd5":{set: { "tokenArr.$.lastItem":cj.timeDate } });
  6. console.log("aaaa::", aaaa); 输出 aaaa:: { n: 1, nModified: 1, ok: 1 }

问题11 mongoDB 查询数据(数组中指定显示字段)

主要运用了 $ 符号运算 在第二个对象中使用 { ‘facility.device_id.$’: 1 }

  1. const isdevice = dealJSON(await Busin_facility.findOne({ cardMi: siberian, "facility.device_id": { $eq: device_id } }, { 'facility.device_id.$': 1 } ))

数据结构

image.png

结果如下

  1. isdevice: {
  2. _id: '6147fc6aa79284a153066ab2',
  3. facility: [ { device_id: '2afaf54a-3af4-4ec5-853a-91ce2203a813' } ]
  4. }

image.png

问题12 mongoDB 查询数据(数组中指定整个对象)

主要运用了 $ 符号运算 在第二个对象中使用 { ‘facility.$’: 1 }
这个跟问题16 差不多, 这个是显示整个对象

  1. const tokenData=dealJSON(await Busin_device.findOne({ cardMi:card, "facility.token": { $eq:token} }, { 'facility.$': 1 } ))

数据格式

image.png

结果如下

  1. tokenData {
  2. _id: '618ab0395a6c46cf64cf1f02',
  3. facility: [
  4. {
  5. device_id: '2afaf54a-3af4-4ec5-853a-91ce2203a813',
  6. token: 'd456b775c7deb489ac5d9b0ab5742ded',
  7. lastItem: 1636479325
  8. }
  9. ]
  10. }

image.png

问题13 解决mongodb返回数据_id new ObjectId

错误示范

  1. MongoDB数据库链接成功
  2. {
  3. _id: new ObjectId("6128ba6b035059add8804d83"),
  4. user_name: 'admin',
  5. user_pwd: 'bf0e52ddea6bf1d183b3df5ae45188a2'
  6. }

image.png

解决方案

先转成 字符串 格式的数据 再转回json数据即可

  1. let user=JSON.parse(JSON.stringify(req.user))

image.png

问题14 创建索引加快搜索

普通查询

  1. let newdata =await DATAUSER.findOneAndUpdate({source:1, count:0},{$inc:{count:1}}).lean()
  2. // 返回到客户端 需要 900ms

解决方案

使用cmd 命令创建索引

  1. # 进入到 milliontext这个库
  2. mongo milliontext
  3. # 查看 该数据库有那些集合
  4. show collections
  5. # 指定集合 中的某个字段创建索引 (qq这个是我的集合表名称, source是字段名称)
  6. db.qq.createIndex({source:1})

image.png
通过建立索引之后查询速度 10倍提升

image.png