V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
PeakFish
V2EX  ›  Node.js

node mongoose 查找 find ,当前端没有传过来筛选参数的时候 ,查找条件这块应该怎么写?

  •  1
     
  •   PeakFish · 77 天前 · 4578 次点击
    这是一个创建于 77 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上代码,下面的 id 字段 和 status 字段,如果前端没有传过来这个字段,那就 去掉筛选 或 者查询全部。这块应该怎么写?

    const findList = await userModel
      // mongoose 的查找方法
      .find({
        nickname: { $regex: nicknameReg },
        _id: id ? ObjectId(id) : '查询字段的所有状态 或者 不查询这个字段, 这块需要怎么写?',
        status: status ? status : '查询字段的所有状态 或者 不查询这个字段, 这块需要怎么写?'
      })
    
    6 条回复    2021-11-10 09:46:31 +08:00
    indo
        1
    indo  
       77 天前 via iPhone   ❤️ 1
    我的想法应该是在函数入口加下判断,是否有入参,有责用入参,没有则空。
    dream4ever
        2
    dream4ever  
       77 天前   ❤️ 2
    ```js
    const query = {
    nickname: { $regex: nicknameReg }
    }

    if (id) {
    query._id = ObjectId(id)
    }
    if (status) {
    query.status = status
    }

    const findList = await userModel.find(query)
    ```
    tukon479
        3
    tukon479  
       75 天前
    用 $and 和 $or 就行了

    `{ $and: [ { $or: [_id ? {_id}: {}] } , { $or: [ status ? {status} : {} ] } ] }`
    ChangJingli
        4
    ChangJingli  
       26 天前
    @dream4ever 目前 where 条件都是这么写的,条件多的时候感觉很不优雅
    dream4ever
        5
    dream4ever  
       26 天前
    @ChangJingli 忽然想到其实可以把这个常用的需求封装成一个方法,做一层抽象,用起来就能“优雅”一点了
    ChangJingli
        6
    ChangJingli  
       25 天前
    @dream4ever 提取到 service 层仍是这样拼 where 条件;我尝试过封装公共 util 过滤条件,然而发现过滤条件跟业务有强耦合,util 不知道你什么时候需要保留空字符串,什么时候不需要,`null`类型 亦如此。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1290 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:41 · PVG 01:41 · LAX 09:41 · JFK 12:41
    ♥ Do have faith in what you're doing.