- 问题1:数据中多了‘’__v‘’字段
- 问题2 : 运行脚本,提示
- 问题3 mongodb 的主键id(Object) 作为查询条件的方法
- 问题4 关于从页面上获取的数据
- 问题5 给数据库创建用户
- 问题6 关于mongodb聚合查询
- 问题7 mongoDB 删除数组中的对象
- 问题8 mongoDB 增加数据(对象)到数组中
- 问题9 mongoDB 新增数据(含对象数据)到数组中
- 问题10 mongoDB 修改数据(数组中对象里的字段值)
- 问题11 mongoDB 查询数据(数组中指定显示字段)
- 问题12 mongoDB 查询数据(数组中指定整个对象)
- 问题13 解决mongodb返回数据_id new ObjectId
- 问题14 创建索引加快搜索
问题1:数据中多了‘’__v‘’字段
mongoose操作mongodb数据库发现文档中多了__v’字段
解决 : 只需要在Schema中,添加第二个对象 {versionKey: false }
var OrderSchema = mongoose.Schema({
order_id: Number,
uid: Number,
trade_no: String
}, {versionKey: false})
问题2 : 运行脚本,提示
解决,把提示的,添加在建立数据连接的地方
useNewUrlParser 这个属性会在url 里面识别验证用户所需的db , 未升级前是不需要指定的,升级到一定要指定
问题3 mongodb 的主键id(Object) 作为查询条件的方法
const ObjectId = require('mongodb').ObjectId;
let resLei = await cardLeiModelSchema.find({ soft_id:ObjectId(soft_id)}
问题4 关于从页面上获取的数据
问题5 给数据库创建用户
1.第一次打开cmd窗口并以授权方式进入了mondb
2.创建了数据库
这个时候,想要给这个数据库创建用户,则需要重启cdm窗口才能正常创建用户,否则会报错数据库未定义
问题6 关于mongodb聚合查询
聚合查询需要用agg 来执行 ,但是find 也是能使用聚合查询
find的第二个参数表示 要显示的字段 1为显示
let resLei = await cardLeiModelSchema.find({ soft_id: soft_id },{card_name:1})
math条件project 要显示的字段 1为显示
let resUserCardLei = await cardLeiModelSchema.aggregate([{ project: { card_name: 1 } } ])
问题7 mongoDB 删除数组中的对象
方法1 $pull
同时也支持条件为字符串的
card_name 是中文字符串 类型的
var result = await cardLeiModelSchema.update(
{ soft_id: req.query.soft_id },
{ $pull: { "camilla": { card_name: req.query.card_name } } }
)
{
_id: 5150a1199fac0e6910000002,
name: 'some name,
items: [
{id: 23, name: 'item name 23'},
{id: 24,name: 'item name 24'}
]
}
db.mycollection.update(
{'_id': ObjectId("5150a1199fac0e6910000002")},
{ $pull: { "items" : { id: 23 } } }
);
注意这里删除的方式用的是updateOne 更新的指令后附带$pull 组成的删除效果
更要注意的是状态的标识不同
const result = await Back_agencyUser.updateOne({ devId: _id , devMail: email}, { $pull: { "agencyObject": { agent_id: agent_id, agent_email:agent_email } } })
result.modifiedCount == 1 ? varMessage = "删除成功" : varMessage = "删除失败"
console.log('删除状态:', result.modifiedCount)
方法2 $pop
-1 表示删除最前面 1 表示删除最后面
await tokenApiModel.updateOne({ cardMi: card }, { $pop: { tokenArr: -1 } })
// 打印
aaa { n: 1, nModified: 1, ok: 1 }
需要删除tokenArr数组里的所有对象 使用 $pull
await tokenApiModel.updateOne({ cardMi: card }, { $pull: { tokenArr: {} } })
问题8 mongoDB 增加数据(对象)到数组中
方法1 $addToSet
这种是前提有查询的条件的,才能 插入或者更新对象数据到数组中
db.class.update({name: "class1"}, {$addToSet:{student:{name: "zhaoliu", age: 17}}});
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 }
await cardLeiModelSchema.update({soft_id: data.softIDs},{$addToSet:{camilla:{ aa }}})
方法2 save()
//【开发者】增加 软件数据的接口 addSoft.js 备份==============================================================
router.post('/IncreaseData2', async (req, res) => {//数据 表单 添加软件数据接口 弹出层
let dataObj = { "code": 200, "msg": "ok" }
let now = new Date();
let dataItem = dateFormat(now, "yyyy-mm-dd' 'HH:MM:ss");
let { soft_name, prefix, theendcap, toplander, equip, tryout, headerbeat_interval, camilo_length, software_anno } = req.body
let { key, secret } = appkey('chenchen', 18);
let data = await new softwareModelSchema({
user_id: req.session.userinfo._id,//谁创建的的
soft_name: soft_name,//软件名称
soft_AppKey: key,//软件id =====
soft_Secret: secret,//软件密码
prefix: prefix,//前缀
theendcap: theendcap,//多开上限
toplander: toplander,//顶号登陆
equip: equip,//设备绑定
tryout: tryout,//是否试用
tryout_interval: 10,//试用分钟
tryout_item: '',//试用间隔
headerbeat_interval: headerbeat_interval,//心跳最大间隔
camilo_length: camilo_length,//卡密长度
camilo_rule: '卡密规则',//卡密规则
software_anno: software_anno,//卡密公告
is_valid: '1',//状态
create_date: dataItem,//添加时间
update_date: '',//最近更新
}).save(() => {
console.log("添加成功");
})
//1.增加软件之后,获取该软件的本身id
//2.关联软件id到 卡类理表 6种卡类 创建 数据
let result = await softwareModelSchema.find({ 'soft_name': soft_name }, { _id: 1 })
let soft_id = result[0]._id;
//关联软件id到 卡类理表cardLei 创建6种卡类 数据
if (result[0]._id != undefined || result[0]._id != "undefined") {
var dataCard = [
{ soft_id: soft_id, card_name: "年卡", card_Limitation: 1, remark: '360天', price: 2, is_valid: 1, create_date: dataItem },
{ soft_id: soft_id, card_name: "季卡", card_Limitation: 1, remark: '120天', price: 2, is_valid: 1, create_date: dataItem },
{ soft_id: soft_id, card_name: "月卡", card_Limitation: 1, remark: '30天', price: 2, is_valid: 1, create_date: dataItem },
{ soft_id: soft_id, card_name: "周卡", card_Limitation: 1, remark: '7天', price: 2, is_valid: 1, create_date: dataItem },
{ soft_id: soft_id, card_name: "天卡", card_Limitation: 1, remark: '24小时', price: 2, is_valid: 1, create_date: dataItem },
{ soft_id: soft_id, card_name: "时卡", card_Limitation: 1, remark: '60分钟', price: 2, is_valid: 1, create_date: dataItem }
];
for (let i = 0; i < dataCard.length; i++) {
let addCard = await new cardLeiModelSchema(dataCard[i]).save()
}
}
res.send(dataObj)
})
问题9 mongoDB 新增数据(含对象数据)到数组中
//model模型
{
"user": "",
"tokenMd5": "",
"tokenArr":[
{"device_id"'':,"token": "" ,"lastItem": },
]
}
//这种数据需求
{
"user": "AI78omR16IUrjpl63k3E2",
"tokenMd5": "0c939e8ad3156096fa21f7299538435f",
"tokenArr":[
{"device_id":1001,"token": "QUk3OG9tUjE2SVVyanBsNjNrM0UyIiwiZGV2aWNl" ,"lastItem": 1625885547},
]
}
方法1_插入数据到数组中updateOne()
对象数据
let dddd={ device_id: 10023, token: "11111d11d111", lastItem: 1124212121 }
属于更新,条件,找到对应的id
let ddd = await tokenApiModel.updateOne({ _id: "60eac0657b65e13178caec3d" }, { $addToSet: { tokenArr: dddd }});
等同于上面一个语句
let ddd = await tokenApiModel.updateOne({ _id: "60eac0657b65e13178caec3d" }, { $addToSet: { tokenArr: { device_id: 10023, token: "11111d11d111", lastItem: 1124212121 } } });
方法2_新建数据携带数组new()
对象数据,并携带了 字符串的数据
let dddd = { device_id: 10023, token: "11111d11d111", lastItem: 1124212121 }
let ddd = await new tokenApiModel({ card: card, tokenMd5: cj.tokenMd5, tokenArr: [dddd] }).save();
let ddd = await new tokenApiModel({ card: card, tokenMd5: cj.tokenMd5, tokenArr: [{ device_id: 10023, token: "11111d11d111", lastItem: 1124212121 }] }).save();
问题10 mongoDB 修改数据(数组中对象里的字段值)
数据结构 $set
//数据结构
{
"_id": "60ebfcd838cc6a36d0c8d9d1",
"tokenArr": [
{
"device_id": "10001",
"tokenMd5": "b9534402c5169bbd10e7f3b22cca3b3c",
"token": "zUZA-iCYo6j7XK3NRSrETAVHa6iD2JKcKoH3kZq-i2Q",
"lastItem": 1626078425
},
{
"device_id": "10002",
"tokenMd5": "cae5039b019e6f9cae2cd51e8fb60832",
"token": "AAo_Fz_XCjA2gFzZqj3K_gMvzFDkX16oobYjcdE7ntQ",
"lastItem": 1626079306
}
],
"lastItem": 1626078425,
"cardMi": "utMY0G7mDe1ubXEY67J3B",
"cardMd5": "b401319df5c6cd9283a3039d973d0464"
}
修改语句
//把用户最新的时间戳更新进去
let aaaa = await tokenApiModel.updateMany({ cardMi: card ,"tokenArr.tokenMd5":{set: { "tokenArr.$.lastItem":cj.timeDate } });
console.log("aaaa::", aaaa);
//把用户最新的时间戳更新进去
let aaaa = await tokenApiModel.updateMany({ cardMi: card ,"tokenArr.tokenMd5":{set: { "tokenArr.$.lastItem":cj.timeDate } });
console.log("aaaa::", aaaa); 输出 aaaa:: { n: 1, nModified: 1, ok: 1 }
问题11 mongoDB 查询数据(数组中指定显示字段)
主要运用了 $ 符号运算 在第二个对象中使用 { ‘facility.device_id.$’: 1 }
const isdevice = dealJSON(await Busin_facility.findOne({ cardMi: siberian, "facility.device_id": { $eq: device_id } }, { 'facility.device_id.$': 1 } ))
数据结构
结果如下
isdevice: {
_id: '6147fc6aa79284a153066ab2',
facility: [ { device_id: '2afaf54a-3af4-4ec5-853a-91ce2203a813' } ]
}
问题12 mongoDB 查询数据(数组中指定整个对象)
主要运用了 $ 符号运算 在第二个对象中使用 { ‘facility.$’: 1 }
这个跟问题16 差不多, 这个是显示整个对象
const tokenData=dealJSON(await Busin_device.findOne({ cardMi:card, "facility.token": { $eq:token} }, { 'facility.$': 1 } ))
数据格式
结果如下
tokenData {
_id: '618ab0395a6c46cf64cf1f02',
facility: [
{
device_id: '2afaf54a-3af4-4ec5-853a-91ce2203a813',
token: 'd456b775c7deb489ac5d9b0ab5742ded',
lastItem: 1636479325
}
]
}
问题13 解决mongodb返回数据_id new ObjectId
错误示范
MongoDB数据库链接成功
{
_id: new ObjectId("6128ba6b035059add8804d83"),
user_name: 'admin',
user_pwd: 'bf0e52ddea6bf1d183b3df5ae45188a2'
}
解决方案
先转成 字符串 格式的数据 再转回json数据即可
let user=JSON.parse(JSON.stringify(req.user))
问题14 创建索引加快搜索
普通查询
let newdata =await DATAUSER.findOneAndUpdate({source:1, count:0},{$inc:{count:1}}).lean()
// 返回到客户端 需要 900ms
解决方案
使用cmd 命令创建索引
# 进入到 milliontext这个库
mongo milliontext
# 查看 该数据库有那些集合
show collections
# 指定集合 中的某个字段创建索引 (qq这个是我的集合表名称, source是字段名称)
db.qq.createIndex({source:1})
通过建立索引之后查询速度 10倍提升