如何使用SailsJS和MongoDB查询动态条件数

时间:2015-12-18 19:01:55

标签: model-view-controller sails.js sails-mongo

我正在使用SailsJS和MongoDB。 对于模型“帐户”我使用下面的代码:

attributes: {   
    campaignID : { type: 'string' },
    cell : { type: 'string' },
    firstname : { type: 'string' },
    lastname : { type: 'string' },
    ssn : { type: 'integer' }
  }

问题是我不知道如何编写代码来查询模型,我可以为模型中的属性设置任意数量的条件。 例如,一个查询可以使用cell =“5”查询所有查询并且ssn =“123456789” 另一个查询可以使用lastname =“Borune”查询所有查询。 当前我在控制器中的代码下面实现了:

list: function(req,res) {
        Accounts.find().where({
            campaignID' : {
                contains : req.param('campaignID')
            },
            cell:{
                contains : req.param('cell')
            }
        }).exec(function(err,data){
            if (err) res.json({error:'true'});
            res.json(data);
        });     
    }

但问题是当我只想使用一个属性作为下面的地址等条件时,由于未在参数中定义单元格,因此不会返回任何文档。

http://localhost:1337/search?campaignID=testID2

如何编写条件代码,以便我可以指定上述任意数量的条件并获取符合所有条件的文档。

1 个答案:

答案 0 :(得分:1)

在您真正尝试查找任何内容之前,请先形成搜索条件。如果您使用查询字符串传递参数(例如/search?campaignID=foo&cell=42),则应该类似于:

list: function(req,res) {
  // req.query is {campaignID: 'foo', cell: '42'}
  var criteria = _.mapValues(req.query, function(val) {
    return {contains: val};
  })
  // criteria is {campaignID: {contains:'foo'}, cell: {contains: '42'}}
  Accounts.find(criteria).exec(function(err,data){
    if (err)  {
      return res.json({error:'true'});
    }
    res.json(data);
  });     
}

如果您想使用请求有效负载而不是查询字符串,则应将req.query更改为req.body

如果你没有通过配置将其添加到sails autoload,请不要忘记控制器文件顶部的var _ = require('lodash')