能否基于数组外的值查询?求未浏览商品的查询实现方案
获取用户下一个未浏览商品的查询方案
我来帮你梳理如何实现这个需求——从用户集合里找出当前用户还没浏览过的其他用户商品,也就是其他用户的goodsId不在当前用户的viewedGoods数组里的目标商品。下面结合你给的示例,针对常见的数据库场景给出具体方案:
核心逻辑梳理
我们要做的就是两步:
- 先排除当前用户自己的数据
- 再筛选出
goodsId不在当前用户viewedGoods列表里的其他用户商品 - 按需返回第一个符合条件的商品,或者所有符合条件的商品
针对文档型数据库(以MongoDB为例)的查询语句
假设你的用户集合叫users,当前用户的信息是:
{ "goodsId": "3wdj9", "viewedGoods": ["djen9", "2wk01"] }
1. 获取第一个未浏览的商品(匹配你的示例需求)
用findOne就能直接拿到第一个符合条件的结果:
db.users.findOne({ // 排除当前用户自己 goodsId: { $ne: "3wdj9" }, // 筛选goodsId不在当前用户已浏览列表中的文档 goodsId: { $nin: ["djen9", "2wk01"] } }, { // 只返回需要的goodsId字段,隐藏_id goodsId: 1, _id: 0 })
对应你的示例:
- 示例1里,被查询用户1的
goodsId是edij2,不在已浏览列表里,所以会返回{ "goodsId": "edij2" } - 示例2里,用户1的
goodsId是djen9(在已浏览列表中)会被过滤掉,用户2的sds33符合条件,所以返回{ "goodsId": "sds33" }
2. 获取所有未浏览的商品
如果需要拿到所有符合条件的商品,把findOne换成find再转成数组就行:
db.users.find({ goodsId: { $ne: "3wdj9" }, goodsId: { $nin: ["djen9", "2wk01"] } }, { goodsId: 1, _id: 0 }).toArray()
关系型数据库(以MySQL为例)的适配方案
如果你的数据存在关系型数据库里,通常会把viewedGoods拆成单独的关联表(比如user_viewed_goods,存储用户的goodsId和对应的浏览商品ID),这时可以用NOT EXISTS来筛选:
SELECT goodsId FROM users WHERE goodsId != '3wdj9' AND NOT EXISTS ( SELECT 1 FROM user_viewed_goods WHERE user_viewed_goods.user_goods_id = '3wdj9' AND user_viewed_goods.viewed_goods_id = users.goodsId ) LIMIT 1; -- 只取第一个未浏览的商品
小提示
实际开发时,记得把语句里的硬编码值(比如"3wdj9"和["djen9", "2wk01"])换成当前用户的动态数据哦~
内容的提问来源于stack exchange,提问作者magglem
相关产品推荐
相关产品推荐

