MongoDB $和查询不使用变量查询字符串

时间:2015-08-26 07:18:16

标签: javascript node.js mongodb mongoose

我将MongoDB $and$lt$gt结合使用,如下所示:

  var queryString0 = 'data.' + req.body.data[0].keyname;

  console.log(queryString0);
  //Prints 'data.price'

  Company.find({ $and : [{ queryString0 : { $lt : 200, $gt : 100}}]}, {name: 1, queryString0 : 1} , function(err, result) {
    if (err) {
      throw err;
    }

    res.send(result);

  });

问题是,当我使用queryString0检索数据时,这没有给我任何结果,但是,如果我使用这样的静态字符串,它会给我所需的结果:

  var queryString0 = 'data.screener.' + req.body.data[0].keyname;

  console.log(queryString0);
  //Prints 'data.price'

  Company.find({ $and : [{ 'data.price' : { $lt : 200, $gt : 100}}]}, {name: 1, 'data.price' : 1} , function(err, result) {
    if (err) {
      throw err;
    }

    res.send(result);

  });

这对我没有任何意义,因为在这两种情况下都应该提供相同的查询字符串。

请帮我弄清楚我的代码有什么问题。

编辑:我使用$and的原因是因为我还需要检查几个字段是否与我的其他条件匹配,如下所示:

  var queryString0 = 'data.screener.' +req.body.data[0].keyname;
  var queryString1 = 'data.screener.' +req.body.data[1].keyname;

  Company.find({ $and : [
    {queryString0 : {$lt : req.body.data[0]["max"], $gt : req.body.data[0]["min"]}},
    {queryString1 : {$lt : req.body.data[1]["max"], $gt : req.body.data[1]["min"]}}
  ] },{ name : 1, queryString0 : 1, _id : 0 }, function(err, result) {
    if (err) {
      throw err;
    }

    res.send(result);

  })

1 个答案:

答案 0 :(得分:2)

你开始使用正确的概念我在代码中构建了一些东西,但是忘记了JavaScript“字符串化”对象键。所以有一个不同的表示法。

此外,您根本不需要$and

var queryString0 = 'data.screener.' + req.body.data[0].keyname;

var query = {};
query[querystring0] = { $lt : 200, $gt : 100};

var projection = { name: 1 };
projection[querystring0] = 1;

Company.find(query,projection,function(err,result) {
   // work in here
});

所以“括号”表示法是如何使用变量内容作为键的名称。并且“所有”MongoDB查询参数无论如何都是“和”条件,所以你很少需要用$and包装它们,除非你需要为同一个字段提供“两个或更多”的条件。