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 中搜索对象

Mongoose Schema 未按预期在对象的内置 Getter 中进行转换

Mongoose 按填充字段排序

Mongoose- 将数组中的数据搜索/过滤到具有特定项目的另一个数组中

如何使用 Mongoose 在 mongodb 中存储动态对象数组?