const mongodb = require('mongodb')//引入模块
const mongoCt = mongodb.MongoClient//实例化
//id:ObjectId("5e6f61ac860bf5190058610d") 由于这个数据库的id是这样的
let objectId = mongodb.ObjectId//用这方法把里面的字符串取出来
//
//连接数据库功能
let open = ({dbname,collection,url='mongodb://localhost:27017'})=>{
//传参 第一个是数据库名 第二个是集合名 第三个是数据库地址 有默认值
return new Promise((resovle,reject)=>{//利用promise 来解决回调地域
mongoCt.connect(url,{ useUnifiedTopology: true },(err,client)=>{
if(!err){//如果链接没有错误执行
let db = client.db(dbname)//拿到数据库名
let colloct = db.collection(collection)//拿道数据库里面的集合名字
resovle({colloct,client})//成功的回调
}else{
reject(err)
}
})
})
}
//查询集合列表数据
let findlist = ({//传入集合名 数据库名 跳过的条数,限制条数,如何排序,查询的条件
collection,
dbname='student'
,_skip,_limit,_sort,q
})=>{
//生成检索条件 这里比如说 要查询用户名包含传入的 q参数
// let rule = q ? {username:new RegExp(q,"g")} :{} // 条件不能使用 正则/q/ 这里面q获取不到是个字符串而不是变量
let rule = q ? {username:eval("/"+q+"/")} :{} //eval可以直接执行里面的代码
return new Promise((resovle,reject)=>{
open({dbname,collection})//调用上面的open方法
.then(({colloct,client})=>{
colloct.find(rule,{
skip:(_skip-1)*_limit-0,//跳过几条 这样传参实现了数据分页功能
limit:_limit-0, //限制查询几条
// projection:{address:0},//不显示address属性
sort:{[_sort]:1}//排序 当一个变量是key的时候 用[]包裹
}).toArray((err,result)=>{
if(!err &z& result.length>0){
resovle({err:0,data:result})
}else{
resovle({err:1,data:'没有数据.....'})
}
client.close()
})
})
.catch((err)=>{
reject({err:1,data:"获取数据失败"})
})
})
}
exports.open = open
exports.findlist = findlist
这样就可以在express模块中调用这个查询mongodb的方法