【问题标题】:Mongoose search data by objectMongoose 按对象搜索数据
【发布时间】: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 字段,因为我需要在这个项目中制作更大的过滤器?

【问题讨论】:

    标签: angularjs node.js mongodb express mongoose


    【解决方案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 奇怪。我已经编辑了我的答案,它现在可以工作了!
    猜你喜欢
    • 2023-04-01
    • 2017-05-21
    • 2022-12-12
    • 2012-01-13
    • 2023-01-05
    • 2013-01-07
    • 2013-04-02
    • 1970-01-01
    • 2016-05-31
    相关资源
    最近更新 更多