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"}]};
我收到以下错误:
当我尝试@MykolaBorysyuk's answer时:query.overview = {$or: [{overview : {"$regex": options.overview, "$options":"i"}}, {tag_list : {"$regex": options.overview, "$options": "i"}} ]};
我得到了
在node.js应用程序中使用$或运算符的命令行参数有什么问题?
答案 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
我检查了字段是否存在,但这是可选的。
祝你好运。