我正在使用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更干净,请告诉我。
答案 0 :(得分:1)
$ in会正常工作。只需在req.body中形成一个包含所有选项的数组:
['radioOption1', 'checkOption1','checkOption2']
现在使用这个,
db.collection('parts').find({option_name:{$in:['radioOption1', 'checkOption1','checkOption2']}})
这将检索option_name为radioOption1或checkOption1或checkOption2的所有文档。