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

Man*_*hal 5 javascript mongodb mongo-shell

这是我要执行的 JavaScript 函数:

var collectionCreation = function(){
  db.myFirstCollection.find();
};
collectionCreation();
Run Code Online (Sandbox Code Playgroud)

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

mongo localhost:27017/myFirstDatabase G:\MongoDB\createColl.js
Run Code Online (Sandbox Code Playgroud)

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

Nei*_*unn 6

问题是,当您键入 时,您期望得到与在REPLdb.myFirstCollection.find()中看到的结果相同的结果,但这不是这里发生的情况。如前所述,它是一个REPL,这意味着该语句将被计算到“左侧”,除非以其他方式分配给变量或在本例中“在函数内部”。

因此,只需执行一些操作即可实际“打印”输出:

var collectionCreation = function(){
  db.myFirstCollection.find().forEach(printjson)
};
collectionCreation();
Run Code Online (Sandbox Code Playgroud)

您在 shell 中看到的db.myFirstCollection.find()实际上是 的“左手赋值”,然后对其Cursor进行求值并迭代前 20 个结果。

您也可以通过执行以下操作来阻止这种情况立即发生:

var cursor = db.myFirstCollection.find()
Run Code Online (Sandbox Code Playgroud)

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

cursor
Run Code Online (Sandbox Code Playgroud)

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

所以当你“编写脚本”时,你实际上需要对返回的结果做一些事情Cursor。在这种情况下,每次迭代的forEach()结果都是 和。printjson

如果您打算“尝试”更多内容,那么我建议您阅读核心文档中的为Shell编写脚本mongo以及在Shell中迭代游标。mongo这些涵盖了您在使用“脚本”时与“交互式”形式工作时遇到的大部分差异,因为您只需将内容输入到shell所在的REPLmongo中。


快速演示

创建一个文件为test.js

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

var listtest = function() {
  db.test.find().forEach(printjson)
}
listtest();
Run Code Online (Sandbox Code Playgroud)

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

mongo --quiet test.js
Run Code Online (Sandbox Code Playgroud)

返回:

{ "_id" : ObjectId("5b13b91a71a13254af4e278e"), "n" : 1 }
{ "_id" : ObjectId("5b13b91a71a13254af4e278f"), "n" : 2 }
{ "_id" : ObjectId("5b13b91a71a13254af4e2790"), "n" : 3 }
Run Code Online (Sandbox Code Playgroud)

请注意,以同样的方式,deleteMany()insertMany()响应也通过包装在内部函数中而受到抑制,因此它们的结果不会“左评估”。