在node.js应用程序中使用$或运算符的此命令行参数有什么问题?

时间:2016-08-23 15:56:17

标签: javascript json node.js mongodb

var MongoClient = require('mongodb').MongoClient,
  assert = require('assert');

var allOptions = [{
  overview: "wiki",
}, {
  milestones: "CMO"
}];

var numQueriesFinished = 0;
var companiesSeen = {};

for (var i = 0; i < allOptions.length; i++) {
  var query = queryDocument(allOptions[i]);
  queryMongoDB(query, i);
}



function queryMongoDB(query, queryNum) {

  MongoClient.connect('mongodb://localhost:27017/crunchbase', function(err, db) {

    assert.equal(err, null);
    console.log("Successfully connected to MongoDB for query: " + queryNum);

    var cursor = db.collection('companies').find(query);

    var numMatches = 0;

    cursor.forEach(
      function(doc) {
        numMatches = numMatches + 1;
        if (doc.permalink in companiesSeen) return;
        companiesSeen[doc.permalink] = doc;
      },
      function(err) {
        assert.equal(err, null);
        console.log("Query " + queryNum + " was:" + JSON.stringify(query));
        console.log("Matching documents: " + numMatches);
        numQueriesFinished = numQueriesFinished + 1;
        if (numQueriesFinished == allOptions.length) {
          report();
        }
        return db.close();
      }
    );

  });

}


function queryDocument(options) {

  var query = {};

  if ("overview" in options) {

    query.overview = {
      $or: [overview: {
          "$regex": options.overview,
          "$options": "i"
        },
        tag_list: {
          "$regex": options.overview,
          "$options": "i"
        }
      ]
    };
  }

  if ("milestones" in options) {
    query["milestones.source_description"] = {
      "$regex": options.milestones,
      "$options": "i"
    };
  }

  return query;

}


function report(options) {
  var totalEmployees = 0;
  for (key in companiesSeen) {
    totalEmployees = totalEmployees + companiesSeen[key].number_of_employees;
  }

  var companiesList = Object.keys(companiesSeen).sort();
  console.log("Companies found: " + companiesList);
  console.log("Total employees in companies identified: " + totalEmployees);
  console.log("Total unique companies: " + companiesList.length);
  console.log("Average number of employees per company: " + Math.floor(totalEmployees / companiesList.length));
}

在上面的代码中,我需要编写一个赋值语句,以确保如果options对象中出现“overview”,我们将匹配值为options.overview的文档。概述“字段或”tag_list“公司文档字段。

我尝试了$or

query.overview = {$or: [overview : {"$regex": options.overview, "$options": "i"}, tag_list : {"$regex": options.overview, "$options": "i"}]};

我收到以下错误:

enter image description here

当我尝试@MykolaBorysyuk's answer时:query.overview = {$or: [{overview : {"$regex": options.overview, "$options":"i"}}, {tag_list : {"$regex": options.overview, "$options": "i"}} ]};

我得到了

enter image description here

在node.js应用程序中使用$或运算符的命令行参数有什么问题?

2 个答案:

答案 0 :(得分:3)

来自文档https://docs.mongodb.com/manual/reference/operator/query/or/

数组中的$或运算符应包含对象。所以查询应该是这样的。

query.overview = {$or: [{overview : {"$regex": options.overview, "$options":"i"}}, {tag_list : {"$regex": options.overview, "$options": "i"}} ]};

修改。

这是你的问题。当您使用$或运算符时,您必须始终首先传递它。 因此查询可能看起来像{$or: [...]},但看起来不像{somefield: {$or:[]}}&lt; - 这会导致您的错误。 https://gyazo.com/cb993ecdcbc8f37052878a34d9a27549

要修复代码,请执行此操作

var cursor = db.collection('companies').find(query.overview);

修复查询构建器:

function queryDocument(options) {
  var query = {};
  var arrayOfParams = [];

 if ("overview" in options) {
    arrayOfParams.push({overview: {
      "$regex": options.overview,
      "$options": "i"
    }});

    arrayOfParams.push({tag_list: {
      "$regex": options.overview,
      "$options": "i"
    }});  
 }

 if ("milestones" in options) {
    arrayOfParams.push({milestones: {
      "$regex": options.milestones,
      "$options": "i"
    }});
 }
  query.overview = {$or: arrayOfParams};
  return query;
}

希望这有帮助。

答案 1 :(得分:1)

首先,您应该确定自己了解问题以及要使用的工具。

现在请查看您使用的查询。 Node.JS中的find({overveiw:...})是mongodb shell中的overview的eq。在这里,您正在检查数据库中overview字段的值。

但您要求检查tag_list字段或options.overview字段是否为find({$or:[{"overview":{$exists:true,$regex: options.overview, "$options":"i"}},{"tag_list":{$exists:true,$regex: options.overview, "$options":"i"}}]}) 的值。在mongo shell中给出的查询将如下所示:

query = {$or:[{"overview":{$exists:true,$regex: options.overview, "$options":"i"}},{"tag_list":{$exists:true,$regex: options.overview, "$options":"i"}}]};

所以你非常接近正确的答案。您的查询可能如下所示:

mousedown

我检查了字段是否存在,但这是可选的。

祝你好运。