问题
可能是在提交注册信息时,重复提交了多次。设计时,提交注册页面在提交数据后没有立即跳转页面,于是用户可能多次点击提交,这时小程序还没有来得及检验数据库是否已存在该用户,造成一个用户的“_openid”注册出多个相同“_openid”的账户信息。
解决办法
一、
在注册提交函数里先检测是否存在该用户,已存在则用update更新函数,不存在,才用add新增函数。但是容易增加调用次数,提升成本。
二、
设计时,提交注册页面在提交数据后立即跳转到其它页面,只要不是用户故意,一般不存在多次重复提交了。但有的小程序对注册用户数量敏感的,需要统计用户数量的,或者已存在重复注册用户,需要清理,就要使用第3个方法。
三、
定期清理下重复注册用户。
1.查询所有重复注册用户
在小程序的云开发控制台,数据库栏里,“高级操作”里添加数据库查询语句,查询到存在那些重复注册用户,聚合数量大于1的都是。
db.collection('login_users')
.aggregate()
.group({
_id: '$_openid',
num: $.sum(1)
})
.match({
num: _.gt(1)
})
.end()
2.查询这些重复用户的_id号
查询这些重复用户的_id号,存入缓存,以便删除,但每一个_openid用户都要留下一个记录,否则就全删除了,这个用户就要重新注册,影响用户体验。云开发控制台里不能暂存数据,于是在微信开发工具里新建了一个页面,专门来去除重复注册用户。
for(var i=0;i<this.data.multiUsers.length;i=i+1){
// multiUsers就是第1步里查出的所有重复注册用户
db.collection('login_users')
.aggregate()
.match({
_openid: this.data.multiUsers[i]._id
})
.sort({
_createTime: -1
})
.limit(this.data.multiUsers[i].num-1)
//一定要num-1,不能全删除了
.project({
_id: 1,
_openid: 1
})
.end()
.then(res => {
console.log('要删除的重名用户:', res.list)
for(var n=0;n<res.list.length;n++){
that.data.deleteUsers.push(res.list[n])}
// 将要删除的_id,_openid存入数组deleteUsers
}).catch(err => {
console.log('云函数调用失败!', err)
})
}
3.删除重复用户的_id号
for(var m=0;m<this.data.deleteUsers.length;m++){
console.log('m:',m)
db.collection('login_users')
.where({
_id:this.data.deleteUsers[m]._id,
_openid:this.data.deleteUsers[m]._openid
})
.remove()
我再这里建了一个按钮,点击按钮才会删除数据,点击之前通过Console查看前面的数据是否有误,无误后再删除,避免删错。真删错了,记住操作时间,可以数据库回档。最好是在小程序暂停服务时,进行删除操作。
点击下面链接,可以下载上述完整代码:
云数据库去除重复注册用户JavaScript代码下载