使用 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