1***@qq.com
1***@qq.com
  • 发布:2025-07-14 09:11
  • 更新:2025-07-14 11:12
  • 阅读:22

【报Bug】联表查询中临时表使用skip()后无法正确匹配关联数据

分类:uniCloud

产品分类: 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 出现了?

2025-07-14 09:11 负责人:无 分享
已邀请:
DCloud_uniCloud_CRL

DCloud_uniCloud_CRL

副表查询是有条件的 order.user_id==user._id,然后才会 skip 和 limit。

副表查询伪代码如下:

db.collection("user").where({_id: "order.user_id"}).skip(1).get()
DCloud_uniCloud_CRL

DCloud_uniCloud_CRL

GitHub上的issues是你发的吗?我已经回复了,或者你就在这个帖子下回复我,不要两边都发。

  • 1***@qq.com (作者)

    github上的issue是我发的,这个帖子我就关闭了吧,在github上询问你

    2025-07-15 12:23

要回复问题请先登录注册