You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否基于数组外的值查询?求未浏览商品的查询实现方案

获取用户下一个未浏览商品的查询方案

我来帮你梳理如何实现这个需求——从用户集合里找出当前用户还没浏览过的其他用户商品,也就是其他用户的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:13:39