Mongoose 按对象搜索数据
Posted
技术标签:
【中文标题】Mongoose 按对象搜索数据【英文标题】:Mongoose search data by object 【发布时间】:2015-11-10 11:28:34 【问题描述】:我想通过 JSON 对象在数据库中进行搜索。
这是我的架构:
var patientSchema = new Schema(
firstname: String,
lastname: String,
age: String,
tel: String,
work: [workSchema],
);
我的 Angular js 请求,发送一个 JSON 对象,它将是:
'firstname':'value', 'lastname':'value', 'age':'age','tel':tel
有没有办法直接在 Patient Schema 中搜索匹配项? 所以如果 JSON 对象只包含名字值 .. 它会检查
在 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 字段,因为我需要在这个项目中制作更大的过滤器?
【问题讨论】:
【参考方案1】:我不知道这是否是最好的方法,但这是一个开始。我会遍历您的键并动态构建您的查询。通过循环访问您的密钥,您可以添加任意数量的密钥。对于每个键,将您的新正则表达式推送到您的查询变量。最后,将您的结果用作查询。
代码如下:
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);
);
【讨论】:
谢谢你这可能会做我要测试的技巧,但我认为应该没问题 这里唯一的问题是 key: new RegExp(filter[key], 'i') 第一个键在循环中仍然是“键”它没有得到它的值,但是过滤[key] 工作正常,所以查询 deosn't find anything 不知道它是否有猫鼬问题? @Kiu 我不认为我理解你的问题,因为 key 没有打印为字符串“key”,而是作为对象中的实际键......跨度> 实际上是的,它没有得到值,但它打印字符串但 filter[key] 工作正常。这就是我在 console.log 查询时得到的结果 '$or' : [ key : /John/i , key: /doe/i ] @Kiu 奇怪。我已经编辑了我的答案,它现在可以工作了!以上是关于Mongoose 按对象搜索数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 Mongoose 找不到按 ObjectId 搜索的文档
Mongoose Schema 未按预期在对象的内置 Getter 中进行转换