app.get('/admin/reservas/:param', function(req, res) {
var param = req.param("param");
console.log(param);
mongoose.model('Something').findOne(
{
id: param
}, function(err, obj) {
res.send(obj);
console.log(obj);
}
);
});
我有这条路线,这个EJS:
<% for(var i = 0; i < data.length; i++) { %>
<td> <a href= <%="/admin/reservas/" + data[i].id + ""%>><%= data[i].id %></a></td>
<td> <a href= <%="/admin/reservas/" + data[i].name + ""%>><%= data[i].name %></a></td>
<% } %>
很好,当我点击id时,我会在数据库中找到我想要的id,但我希望能够通过名称找到它。
所以我试图改变路线:
app.get('/names/:param', function(req, res) {
var param = req.param("param");
console.log(param);
mongoose.model('Something').findOne(
{
id: param,
name: param
}, function(err, obj) {
res.send(obj);
console.log(obj);
}
);
});
但是返回任何内容,包括id和名称
答案 0 :(得分:1)
默认情况下,MongoDB查询参数始终是逻辑和条件。为了使用逻辑或,有$or
运算符:
app.get('/admin/reservas/:param', function(req, res) {
var param = req.param("param");
console.log(param);
mongoose.model('Something').findOne(
{
"$or": [
{ id: param },
{ name: param }
]
}, function(err, obj) {
res.send(obj);
console.log(obj);
}
);
});
$or
运算符使用一组查询文档来考虑条件。这是一个&#34;短路&#34;匹配评估为true
的第一个条件使该语句成立。
如果没有特定问题,至少会是这样。请参阅_id
,它的id
别名是MongoDB和Mongoose的特殊值。默认情况下,这将尝试&#34;施放&#34;如果提供的字符串无效,例如&#34; fred&#34;例如。
这会在提供查询参数时导致异常。因此,底线规则是你不能&#34;混合类型&#34;以这种方式处于 ObjectID
条件中的某些内容无法从$or
转换后继续存在。你必须这样做&#34;逻辑上&#34;以不同的方式测试价值
它是什么:
String
这意味着现在以一种mongoose将解析它的方式构建查询,考虑到模式&#34;类型&#34;然后申请就没有错误,因为决定哪个字段在其他地方进行查询。
当然,你可以绕过&#34;绕过&#34; mongoose方法行为,只需使用原始驱动程序:
app.get('/admin/reservas/:param', function(req, res) {
var param = req.param("param");
console.log(param);
var query = {};
try {
var id = mongoose.mongo.ObjectID(param);
query = { "id": id };
} catch {
query = { "name": param };
}
mongoose.model('Something').findOne(
query, function(err, obj) {
res.send(obj);
console.log(obj);
}
);
});
但是当然你需要自己进行类型转换,不仅仅是为了测试&#34;否则即使是正确的&#34; String&#34;表示 app.get('/admin/reservas/:param', function(req, res) {
var param = req.param("param");
console.log(param);
var id ="";
try {
id = mongoose.mongo.ObjectID(param);
}
mongoose.model('Something').collection.findOne(
{
"$or": [
{ id: id },
{ name: param }
]
}, function(err, obj) {
res.send(obj);
console.log(obj);
}
);
});
的值不起作用。