CloudBase / MongoDB 风格跨端身份系统方案
包含 集合设计、字段、CRUD 操作流程,直接可落地。
1️⃣ 集合设计
1. users(全局用户信息)
- 存储跨平台通用的业务用户信息
_id:数据库自动生成(cloudbase自动生成)global_user_id:自建 UUID,用于跨端统一标识
{
"_id": "自动生成", // CloudBase 内部主键
"global_user_id": "uuid_12345", // 自建 UUID,全局唯一
"nickname": "小明",
"avatar_url": "url1",
"email": "",
"phone": "",
"created_at": 169234234,
"updated_at": 169234567
}
2. user_identities(平台身份绑定)
- 存储各平台账号信息和全局用户关联
_id:数据库自动生成(cloudbase自动生成)platform_user_id:平台专用 ID(如小程序_openid)global_user_id:关联users.global_user_id
{
"_id": "自动生成", //cloudbase内部主键
"global_user_id": "uuid_12345", // 关联 users.global_user_id
"platform": "wechat", // 平台标识:wechat/apple/google等
"platform_user_id": "_openid", //平台生成,平台专用id
"credential": "token", //可选,存登录凭证
"last_login_time": 169234567,
"bind_time": 169234234
}
索引:platform + platform_user_id 唯一索引
2️⃣ CRUD 操作方案
2.1 查询用户(任意平台登录)
// 查询 user_identities
const identityRes = await db.collection('user_identities')
.where({ platform: 'wechat', platform_user_id: '_openid' })
.get();
if (identityRes.data.length > 0) {
const globalUserId = identityRes.data[0].global_user_id;
// 查询 users
const userRes = await db.collection('users')
.where({ global_user_id: globalUserId })
.get();
console.log(userRes.data[0]);
} else {
// 用户不存在 → 新建流程
}
2.2 新建用户(首次登录)
// 生成全局 UUID
const newGlobalId = generateUUID();
// 插入 users
const userRes = await db.collection('users').add({
global_user_id: newGlobalId,
nickname: '新用户',
avatar_url: '',
created_at: Date.now(),
updated_at: Date.now()
});
// 插入 user_identities
await db.collection('user_identities').add({
global_user_id: newGlobalId,
platform: 'wechat',
platform_user_id: '_openid',
bind_time: Date.now(),
last_login_time: Date.now()
});
2.3 更新全局用户信息(users)
await db.collection('users').where({ global_user_id: 'uuid_12345' }).update({
data: {
nickname: '新昵称',
avatar_url: '新头像',
updated_at: Date.now()
}
});
2.4 更新平台身份信息(user_identities)
await db.collection('user_identities')
.where({ platform: 'wechat', platform_user_id: '_openid' })
.update({
data: {
credential: '新token',
last_login_time: Date.now()
}
});
2.5 新端绑定已有用户
await db.collection('user_identities')
.where({ platform: 'apple', platform_user_id: 'apple_id_xyz' })
.update({
data: {
global_user_id: 'uuid_12345',
last_login_time: Date.now(),
bind_time: Date.now()
}
}, { upsert: true }); // 如果不存在则插入
关键点:upsert 保证幂等操作,避免重复绑定。
3️⃣ 关键设计要点
-
_id:数据库内部主键
-
global_user_id:跨端业务主键,UUID 自建
-
platform_user_id:平台专用 ID,用于区分不同平台用户
-
索引:
platform + platform_user_id唯一索引 -
CRUD 流程:
- 查询 → 判断是否存在
- 新建 → 同步插入
users+user_identities - 更新 → 分别更新全局信息或平台信息
- 绑定新端 → upsert + last_login_time
在 CloudBase / MongoDB 中,可以通过创建 复合唯一索引(compound unique index) 来保证 (platform, platform_user_id) 唯一,从而确保同一平台账号不会重复绑定。
下面详细说明:
1️⃣ MongoDB 原生方式(CloudBase 也适用)
// 获取集合对象
const db = wx.cloud.database();
const userIdentities = db.collection('user_identities');
// 使用 createIndex 创建复合唯一索引
await userIdentities.createIndex(
{ platform: 1, platform_user_id: 1 }, // 索引字段
{ unique: true } // 设置唯一约束
);
{ platform: 1, platform_user_id: 1 }→ 表示索引按升序排列两个字段{ unique: true }→ 表示唯一索引,确保相同平台、相同用户 ID 只能存在一条记录
2️⃣ 在 CloudBase 控制台创建索引
-
打开 CloudBase 控制台 → 数据库 → 选择
user_identities集合 -
点击 索引管理 → 新建索引
-
配置字段:
- 字段1:
platform - 字段2:
platform_user_id - 类型:复合索引
- 唯一:勾选
- 字段1:
-
保存 → 系统会自动创建唯一复合索引
3️⃣ CRUD 操作保证幂等性
有了唯一索引后:
- 插入新绑定记录:如果
(platform, platform_user_id)已存在,会报错,可以用upsert或先查询再插入 - 更新绑定记录:可以直接用
update,确保不会创建重复绑定
示例:
await db.collection('user_identities')
.where({ platform: 'wechat', platform_user_id: '_openid' })
.update({
data: {
global_user_id: 'uuid_12345',
last_login_time: Date.now()
}
}, { upsert: true }); // 如果不存在则插入
- upsert 配合唯一索引 → 自动防止重复绑定
-
**创建复合唯一索引 **
**(platform, platform_user_id)** -
插入/绑定新端时:
- 先查询 → 决定是更新还是插入
- 或使用
upsert→ 唯一索引保证幂等
-
更新操作:
- 通过
(platform, platform_user_id)精确定位 - 不会违反唯一约束
- 通过
✅ 这个方案适用于 微信小程序、H5、iOS、Android 等多平台登录,可直接在 CloudBase 上落地,保证跨端唯一性、可扩展性和业务逻辑清晰。