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"}]};
我收到以下错误:
当我尝试@MykolaBorysyuk's answer时: query.overview = {$or: [{overview : {"$regex": options.overview, "$options":"i"}}, {tag_list : {"$regex": options.overview, "$options": "i"}} ]};
我明白
在 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/