使用 javascript 在 mongodb 终端中创建查询
using javascript to create queries in mongodb terminal
基本上,我在 Mongodb 中有一个数据库,我希望能够在其中搜索特定的内容。我想要一个名为 search.js
的 javaScript 文件,它在命令 line/terminal
中接收这些参数
node search.js --output=file.txt --maxItems=2
这应该运行在数据库中搜索:
db.DatabaseName.find().limit(2)
并将结果打印到输出参数旁边的指定文件。我应该注意,如果未指定 --output
它应该只是默认为终端或者 --maxItems
未指定那么它应该打印结果中的所有项目。
我可以单独使用大部分功能,但我无法将其放入 JavaScript 文件并从命令行获取参数。谁能引导我朝着正确的方向前进?
我在这里以某种方式感觉到,您实际提出的问题确实比您在问题中所表达的要广泛得多。这确实是因为您似乎在要求 "nodejs" 版本的 "mongoexport"。这确实是扩大问题范围的一种方式,但我们至少可以涵盖基础知识。
除了要指定的 "options" 类型之外,除了 "required" 输入之外,您还需要合理数量的默认值,这应该主要是集合名称,因为没有必要硬编码该值的默认值。
选项处理确实应该不仅仅是基本的参数传递。 node-getopt 是一个以合理的行业标准方式实施事物的示例。
所以这个清单涵盖了如何处理事物的基础知识。添加其他功能由您决定:
var fs = require('fs'),
MongoClient = require('mongodb').MongoClient,
Getopt = require('node-getopt');
var getopt = new Getopt([
[ 'o', 'output-file=ARG', 'Output file or STDOUT' ],
[ 'm', 'maxItems=ARG', 'Maximum output items' ],
[ '', 'host=ARG', 'optional host' ],
[ '', 'port=ARG', 'optional port' ],
[ 'd', 'database=ARG', 'optional database' ],
[ 'h', 'help', 'display this help' ],
[ 'v', 'version', 'show version' ]
]).bindHelp();
var opt = getopt.parse(process.argv.slice(2));
if ( opt.argv[0] == undefined ) {
console.log("collection name must be included");
process.exit(-1);
}
var options = {
"host": opt.options.host || 'localhost',
"port": opt.options.port || 27017,
"database": opt.options.database || 'test',
"maxItems": 0,
};
try {
options.maxItems = parseInt(opt.options.maxItems || options.maxItems);
if ( isNaN(options.maxItems) )
throw new Error("maxItems needs to be numeric");
} catch(e) {
console.log(e);
process.exit();
}
console.log( options );
MongoClient.connect(
'mongodb://' + options.host + ':' + options.port
+ '/' + options.database,
function(err,db) {
if (err) throw err;
db.collection(opt.argv[0],function(err,collection) {
if (err) throw err;
var stream = collection.find().limit(options.maxItems).stream();
stream.on('data',function(data) {
stream.pause();
if ( !options.hasOwnProperty('writer') ) {
try {
options.writer = opt.options.hasOwnProperty("output-file") ?
fs.openSync( opt.options["output-file"], 'w' )
: process.stdout.fd;
} catch(e) {
throw e;
}
}
var block = JSON.stringify(data) + "\n";
fs.writeSync( options.writer, block );
stream.resume();
});
stream.on('end',function() {
db.close();
});
stream.on('error',function(err) {
throw err;
});
});
}
);
所以如果我只是调用 sample.js
那么我可以 运行 例如:
node sample.js messages --maxItems 10 --output-file output.json
基本上,我在 Mongodb 中有一个数据库,我希望能够在其中搜索特定的内容。我想要一个名为 search.js
的 javaScript 文件,它在命令 line/terminal
node search.js --output=file.txt --maxItems=2
这应该运行在数据库中搜索:
db.DatabaseName.find().limit(2)
并将结果打印到输出参数旁边的指定文件。我应该注意,如果未指定 --output
它应该只是默认为终端或者 --maxItems
未指定那么它应该打印结果中的所有项目。
我可以单独使用大部分功能,但我无法将其放入 JavaScript 文件并从命令行获取参数。谁能引导我朝着正确的方向前进?
我在这里以某种方式感觉到,您实际提出的问题确实比您在问题中所表达的要广泛得多。这确实是因为您似乎在要求 "nodejs" 版本的 "mongoexport"。这确实是扩大问题范围的一种方式,但我们至少可以涵盖基础知识。
除了要指定的 "options" 类型之外,除了 "required" 输入之外,您还需要合理数量的默认值,这应该主要是集合名称,因为没有必要硬编码该值的默认值。
选项处理确实应该不仅仅是基本的参数传递。 node-getopt 是一个以合理的行业标准方式实施事物的示例。
所以这个清单涵盖了如何处理事物的基础知识。添加其他功能由您决定:
var fs = require('fs'),
MongoClient = require('mongodb').MongoClient,
Getopt = require('node-getopt');
var getopt = new Getopt([
[ 'o', 'output-file=ARG', 'Output file or STDOUT' ],
[ 'm', 'maxItems=ARG', 'Maximum output items' ],
[ '', 'host=ARG', 'optional host' ],
[ '', 'port=ARG', 'optional port' ],
[ 'd', 'database=ARG', 'optional database' ],
[ 'h', 'help', 'display this help' ],
[ 'v', 'version', 'show version' ]
]).bindHelp();
var opt = getopt.parse(process.argv.slice(2));
if ( opt.argv[0] == undefined ) {
console.log("collection name must be included");
process.exit(-1);
}
var options = {
"host": opt.options.host || 'localhost',
"port": opt.options.port || 27017,
"database": opt.options.database || 'test',
"maxItems": 0,
};
try {
options.maxItems = parseInt(opt.options.maxItems || options.maxItems);
if ( isNaN(options.maxItems) )
throw new Error("maxItems needs to be numeric");
} catch(e) {
console.log(e);
process.exit();
}
console.log( options );
MongoClient.connect(
'mongodb://' + options.host + ':' + options.port
+ '/' + options.database,
function(err,db) {
if (err) throw err;
db.collection(opt.argv[0],function(err,collection) {
if (err) throw err;
var stream = collection.find().limit(options.maxItems).stream();
stream.on('data',function(data) {
stream.pause();
if ( !options.hasOwnProperty('writer') ) {
try {
options.writer = opt.options.hasOwnProperty("output-file") ?
fs.openSync( opt.options["output-file"], 'w' )
: process.stdout.fd;
} catch(e) {
throw e;
}
}
var block = JSON.stringify(data) + "\n";
fs.writeSync( options.writer, block );
stream.resume();
});
stream.on('end',function() {
db.close();
});
stream.on('error',function(err) {
throw err;
});
});
}
);
所以如果我只是调用 sample.js
那么我可以 运行 例如:
node sample.js messages --maxItems 10 --output-file output.json