我想通过JSON对象在数据库中进行搜索。
这是我的架构
var patientSchema = new Schema({
firstname: String,
lastname: String,
age: String,
tel: String,
work: [workSchema],
});
我的角度js请求,发送一个将是
的json对象{'firstname':'value', 'lastname':'value', 'age':'age','tel':tel}
有没有办法直接在Patient Schema中搜索匹配? 所以如果json对象只包含firstname值,它将检查
在mysql中我会做,
SELECT * FROM patients WHERE firstname LIKE '%'.json.firstname AND .....
我测试的是
var filter = "{'firstname': 'value', 'lastname': 'value', 'age':'value', 'tel': 'tel'}" //sent from angularjs client
var jsonFilter = JSON.parse(filter);
Patient.find().or([
{ 'firstname': { $regex: new RegExp(filter.firstname,'i') }},
{ 'lastname': { $regex: new RegExp(filter.lastname,'i') }},
{ 'age':{ $regex: new RegExp(filter.age,'i') }},
{ 'tel':{$regex: new RegExp(filter.tel,'i') }}]).exec(function(err, result) {
if ( err)
throw err;
res.json(result);
});
这个工作正常但是如果到达空是空的,那么所有数据都应该被填充它将返回未定义的,这将不会得到正确的数据。因为Angular JS只发送$ scope.data。
有没有办法通过我的json对象获取所有数据。而不是重写所有的json字段,因为我需要在这个项目中制作更大的过滤器。
谢谢
答案 0 :(得分:0)
我不知道这是否是最好的方法,但这是一个开始。我会遍历您的密钥并动态构建您的查询。通过循环键,您可以根据需要添加任意数量的键。对于每个键,将新的正则表达式推送到查询变量。最后,将结果用作查询。
以下是代码:
var filter = {'firstname': 'value', 'lastname': 'value', 'age':'value', 'tel': 'tel'};
var query = {$or: []};
var keys = Object.keys(filter);
for(var i=0;i<keys.length;i++) {
var item = {};
item[keys[i]] = new RegExp(filter[key], 'i');
query.$or.push(item);
}
Patient.find(query).exec(function(err, result) {
if ( err)
throw err;
res.json(result);
});