这是我想要执行的JavaScript函数:
var collectionCreation = function(){
db.myFirstCollection.find();
};
collectionCreation();
从命令提示符处指向bin目录,我想执行包含上述代码的js文件。我试着这样做:
mongo localhost:27017/myFirstDatabase G:\MongoDB\createColl.js
没有显示任何输出。我期待收到我的收藏中的文件。请帮忙。提前谢谢。
答案 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
Shell和Iterate 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()
响应也被包含在内部函数中,因此它们的结果不会被“左评估”。