【问题标题】:Make a mongoDB query using OR statement and array使用 OR 语句和数组进行 m​​ongoDB 查询
【发布时间】:2021-06-21 19:41:20
【问题描述】:

我的网络界面需要访问一个 URL(如下所示)并只返回请求组的结果:

http://localhost:3000/device/getgroups/group1,group2,group3,group4

在 MongoDB 中,我有字段“loc_group”的条目。

我只想返回具有字段“loc_group”= group1 OR group2 OR group3 OR group4 的结果。

我的路线是这样的:

router.get('/getgroups/:groups', async (req, res) => {
  try {
   
    var groups = "req.parms.groups";
    #split groups 
    var arr = groups.split(",");
    
    #iterate in the results on array (arr)
    for (var i = 0; i < arr.length; i++) {
      arr[i] = ++arr[i];
        if (i = arr.lenght) {
        var query = "{'loc_group': '" + arr[i] + "' }"
        var totals = totals + query;
      } else {
        var query = "{'loc_group': '" + arr[i] + "' },"
        var totals = totals + query;
      }
    }

# after this for, the totals must looks like  
#  "{'loc_group': 'group1' }"
#  "{'loc_group': 'group2' }"
#  "{'loc_group': 'group3' }"
#  "{'loc_group': 'group4' }"
#
# then i try to use it on the mongodb query:

    const logues = await device.find({ $or: [ totals ], })

    res.json(logues)
  } catch (err) {
    res.status(500).json({ message: err.message })
  }
})

但它不起作用,我输入网址时得到的是:

{"message":"$or/$and/$nor 条目必须是完整对象"}

我是 nodejs 的初学者,这是我在这里的第一个问题,如果需要其他信息或其他信息,请告诉我。谢谢。

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您的代码存在几个问题。但主要的是基本上忽略了您使用的 API 的期望。看,MongoDB 期望在 $or 查询中传递常规 JavaScript 对象。你给它的是一个字符串化对象的串联,每个对象都由这个表达式创建:

    var query = "{'loc_group': '" + arr[i] + "' }"
    

    ... 传入常规数组。显然,MongoDB 猜不出你想要什么,因此出现了$or/$and/$nor entries need to be full objects 错误。

    因此,与其自己做 JS 工作,不如使用原生对象来创建查询。事实上,您甚至不需要 $or 在这里,因为您正在寻找相同的属性值。引用the docs:

    当使用 $or 时,会检查 相同字段的值,请使用 $in 运算符而不是 $or 运算符。

    所以这是一种(简化的)方法:

    router.get('/getgroups/:groups', async (req, res) => {
      const locGroups = req.params.groups.split(',');
      const logues = await device.find({ loc_group: { $in: locGroups } });
      res.json(logues);
    }
    

    什么?是的,基本上就是这样。您可能会考虑在此代码中添加一些验证和错误处理,也可能是一些日志记录,但无论如何它应该是一个中间件问题,所以控制器保持简单。这就是现代面向后端的生态系统的美妙之处——也是存在的原因:简单的事情应该保持简单。

    【讨论】:

    • 刚刚删除了 [ ] 并且效果很好。我有很多东西要学。
    • 啊,完全忘记了 locGroups 本身就是一个数组,所以 [] 确实不需要。如您所见,有时我们都有一些东西要学。最重要的是永不放弃。 )
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多