使用带有单选按钮和复选框的表单提交数据查询mongodb

时间:2014-02-12 23:04:26

标签: javascript forms mongodb express

我正在使用express构建一个表单,它有多组单选按钮和复选框。提交时,表单选择用于查询数据库中的“parts”集合。

表单示例:

    <input type="radio" name="radio" value="radioOption1">
    <input type="radio" name="radio" value="radioOption2">
    <input type="checkbox" name="checkbox" value="checkOption1">
    <input type="checkbox" name="checkbox" value="checkOption2">

如果您选择第一个收音机和第一个复选框选项并提交,则req.body看起来像:

    {radio:'radioOption1', checkbox:'checkOption1'}

使用此mongo查询查找具有匹配的option_name的文档时可以正常工作:

    db.collection('parts').find({option_name:{$in:req.body}})

但是,如果勾选两个复选框,req.body将变为:

    {radio:'radioOption1', checkbox:['checkOption1','checkOption2']}

虽然$ in仍然找到单选按钮键/值的匹配项,但它对复选框不起作用,因为它们存储在数组中。有没有办法更改我的查询或我的数据来解决这个问题?

编辑: Parts集合的文档类似于:

    {
      "option_name" : "radioOption1",
      "price" : 100
    }
    {
      "option_name" : "radioOption2",
      "price" : 200
    }
    {
      "option_name" : "checkOption1",
      "price" : 300
    }
    {
      "option_name" : "checkOption2",
      "price" : 400
    }

EDIT2: 丹麦的答案解决了这个谜题。在Express中,在运行查询之前,我这样做:

    var productOptions = []

    // iterate thru req.body
    for (var key in req.body) {
      // check if array
      if( Object.prototype.toString.call(req.body[key]) === '[object Array]' ) {
        // push each array value to productOptions
        for(var i = 0;i < req.body[key].length;i++) {
          productOptions.push(req.body[key][i])
        }
      } else {
        productOptions.push(req.body[key])
      }
    }

然后更改查询以使用新的productOptions数组:

    db.collection('parts').find({option_name:{$in:productOptions}})

有效!如果我的javascript更干净,请告诉我。

1 个答案:

答案 0 :(得分:1)

$ in会正常工作。只需在req.body中形成一个包含所有选项的数组:

 ['radioOption1', 'checkOption1','checkOption2']

现在使用这个,

 db.collection('parts').find({option_name:{$in:['radioOption1', 'checkOption1','checkOption2']}})

这将检索option_name为radioOption1或checkOption1或checkOption2的所有文档。