使用mongo shell执行JavaScript函数没有输出

时间:2018-06-03 09:25:23

标签: javascript mongodb mongo-shell

这是我想要执行的JavaScript函数:

var collectionCreation = function(){
  db.myFirstCollection.find();
};
collectionCreation();

从命令提示符处指向bin目录,我想执行包含上述代码的js文件。我试着这样做:

mongo localhost:27017/myFirstDatabase G:\MongoDB\createColl.js

没有显示任何输出。我期待收到我的收藏中的文件。请帮忙。提前谢谢。

1 个答案:

答案 0 :(得分:2)

问题是,当您输入db.myFirstCollection.find()时,您所期望的结果与REPL中的结果相同,但这不是此处发生的情况。如上所述它是REPL,这意味着语句被评估为“左”,除非另有赋值给变量,或者在这种情况下,“在函数内部”。

所以简单地做一些事情来实际“打印”输出:

var collectionCreation = function(){
  db.myFirstCollection.find().forEach(printjson)
};
collectionCreation();

您在shell db.myFirstCollection.find()中看到的实际上是Cursor的“左手分配”,然后对其进行评估,并重复前20个结果。

您可以通过以下方式同样阻止这种情况发生:

var cursor = db.myFirstCollection.find()

在您“评估”之前,不会“打印”这些结果:

cursor

然后将打印出下一个20,这是默认评估。

因此,当您“编写脚本”时,实际上您需要对返回的Cursor结果执行某些操作。在这种情况下,forEach()结果和printjson每次迭代。

如果你打算“玩弄”更多这个,那么我建议你在核心文档中阅读Write Scripts for the mongo ShellIterate a Cursor in the mongo Shell。这些内容涵盖了与“交互式”表单相比,在处理“脚本”时遇到的大部分差异,因为您只需将内容输入mongo shell所在的REPL

快速演示

将文件创建为test.js

(function() {
  db.test.remove({});
  db.test.insertMany([1,2,3].map(n => ({ n })));
})()

var listtest = function() {
  db.test.find().forEach(printjson)
}
listtest();

然后只需在默认的“test”数据库命名空间上执行:

mongo --quiet test.js

返回:

{ "_id" : ObjectId("5b13b91a71a13254af4e278e"), "n" : 1 }
{ "_id" : ObjectId("5b13b91a71a13254af4e278f"), "n" : 2 }
{ "_id" : ObjectId("5b13b91a71a13254af4e2790"), "n" : 3 }

请注意,同样地,deleteMany()insertMany()响应也被包含在内部函数中,因此它们的结果不会被“左评估”。