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

标签 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));
}

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

我尝试了$or:

query.overview = {$or: [概述: {"$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 应用程序中使用 $or 运算符的命令行参数有什么问题?

最佳答案

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

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

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

编辑。

这是你的问题。当您使用 $or 运算符时,您必须始终首先传递它。 因此查询可以看起来像这样 {$or: [...]} 但不能看起来像这样 {somefield: {$or:[]}} <- 这将导致你的错误。 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;
}

希望这有帮助。

关于javascript - 在 node.js 应用程序中使用 $or 运算符的命令行参数有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39105805/

相关文章:

java - 如何正确注册自定义 JsonSerializer?

java - Jackson 直接将嵌套列表作为 POJO

node.js - 在 Express 和 Restify 中处理 uncaughtException

node.js - express 包中的app.get方法

c# - 使用JavaScript从Com Visible dll调用.net dll时出错

javascript - 如何在WebRTC中自动流式传输远程摄像头?

javascript - 如何在 Vue.js 中从 JSON 数据创建 select 元素?

javascript - Nodejs异步任务和匿名函数

javascript - 实例化 JavaScript 模块模式

javascript - CreateJS - 图像位图并不总是显示