如上

- 发布:2025-07-14 09:11
- 更新:2025-07-14 11:12
- 阅读:22
产品分类: uniCloud/App
操作步骤:
预期结果:
如上
如上
实际结果:
如上
如上
bug描述:
order 表数据:
[{
"_id": "order_1001",
"user_id": "user_002", // 指向user表的_id值为user_002的数据
"product_name": "无线耳机",
},
{
"_id": "order_1002",
"user_id": "user_002", // 指向user表的_id值为user_002的数据
"product_name": "机械键盘",
},
{
"_id": "order_2001",
"user_id": "user_001", // 指向user表的_id值为user_001的数据
"product_name": "智能手表",
}
]
order 表结构:
{
"bsonType": "object",
"description": "订单副表",
"required": ["product_name", "user_id"],
"permission": {
"read": true,
"create": true,
"update": true,
"delete": true
},
"properties": {
"_id": {
"description": "订单ID"
},
"user_id": {
"bsonType": "string",
"foreignKey": "user._id", // 指向 user 表的 _id
"description": "关联的用户ID"
},
"product_name": {
"bsonType": "string",
"description": "商品名称",
},
}
}
user 表数据:
[{
"_id": "user_001",
"username": "张三",
},
{
"_id": "user_002",
"username": "李四",
},
{
"_id": "user_003",
"username": "王五",
}
]
user 表结构:
{
"bsonType": "object",
"description": "用户主表",
"required": ["username"],
"permission": {
"read": true,
"create": true,
"update": true,
"delete": true
},
"properties": {
"_id": {
"description": "用户唯一ID"
},
"username": {
"bsonType": "string",
"description": "用户名",
},
}
}
联表查询代码:
const db = uniCloud.database()
const order = db.collection('order').getTemp()
const user = db.collection('user').skip(1).getTemp() // 跳过了user表的第一条数据
async function demo() {
const res = await db.collection(order, user).get()
console.log(res)
}
demo()
通过 skip(1) 跳过了 user 表的第一条数据,此时 user 表应该还剩两条数据:
{
"_id": "user_002",
"username": "李四",
},
{
"_id": "user_003",
"username": "王五",
}
那 order 表通过 user_id 属性
关联了 user 表的 "_id": "user_002" 的数据应该可以正确联表显示出来,按道理 res 的打印结果是:
[
{
"_id": "order_1001",
"user_id": [{
"_id": "user_002",
"username": "李四",
}], // 指向user表的_id值为user_002的数据
"product_name": "无线耳机"
},
{
"_id": "order_1002",
"user_id": [{
"_id": "user_002",
"username": "李四",
}], // 指向user表的_id值为user_002的数据
"product_name": "机械键盘"
},
{
"_id": "order_2001",
"user_id": [], // 指向user表的_id值为user_001的数据,但是user_001的数据被skip(1)跳过了,所以没有
"product_name": "智能手表"
}
]
这是理论上的打印值,实际上的打印值完全不是这样子的,看上传的图1。实际上三项 user_id 属性的值都为空数组,也就是说 order 表本应该可以关联到 user 表_id值为user_002的数据,但是实际上没有关联到!!!
还是之前的 order 和 user 表:
const db = uniCloud.database()
const order = db.collection('order').getTemp()
const user = db.collection('user').limit(1).getTemp() // 从skip(1)修改为limit(1)
async function demo() {
const res = await db.collection(order, user).get()
console.log(res)
}
demo()
把skip(1)修改为limit(1),此时 user 临时表应该只有一条数据:
{
"_id": "user_001",
"username": "张三"
}
然后此时联表的结果是,看上传的图2,可以发现在 user 表中本应不存在的 user_002 出现了?



副表查询是有条件的 order.user_id==user._id,然后才会 skip 和 limit。
副表查询伪代码如下:
db.collection("user").where({_id: "order.user_id"}).skip(1).get()