Выполнение функции JavaScript с оболочкой Монго не имеет выхода - PullRequest
0 голосов
/ 03 июня 2018

Вот моя функция JavaScript, которую я хочу выполнить:

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

Из моей командной строки, указав на папку bin, я хочу выполнить файл js, содержащий приведенный выше код.Я пытаюсь сделать это следующим образом:

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

Это не показывает никакого вывода.Я ожидаю получить документы в моей коллекции.Пожалуйста помоги.Заранее спасибо.

1 Ответ

0 голосов
/ 03 июня 2018

Проблема в том, что вы ожидаете того же результата, который вы видите в REPL при вводе db.myFirstCollection.find(), но это не то, что происходит здесь.Как уже говорилось, это REPL , что означает, что оператор оценивается как «левый», если иное не присвоено переменной или, в данном случае, «внутри функции».

Так просточто-то для «вывода» на печать:

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

То, что вы видите в оболочке db.myFirstCollection.find(), это то, что «левостороннее назначение» Cursor, которое затем оценивается, и первые 20 результатов повторяются..

Аналогичным образом можно остановить это, выполнив:

var cursor = db.myFirstCollection.find()

, который не «печатает» эти результаты, пока вы не «оцените»:

cursor

Который затем распечатает следующие 20, что является оценкой по умолчанию.

Поэтому, когда вы «пишете сценарии», вам действительно нужно что-то сделать с возвращенным результатом Cursor.В этом случае forEach() результаты и printjson на каждой итерации.

Если вы собираетесь "поиграть" с этим, я предлагаю вам прочитать Писать сценарии для mongo Shell , а также Перемещение курсора в mongo Shell в основной документации.Они охватывают большинство различий, с которыми вы столкнетесь при работе со «сценариями» по сравнению с «интерактивной» формой, когда вы просто набираете вещи в REPL , который является оболочкой mongo.


Quick Demo

Создайте файл как test.js

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

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

Затем просто выполните в "тестовом" пространстве имен базы данных по умолчанию как:

mongo --quiet test.js

Возвращает:

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

Обратите внимание, что аналогичным образом ответы deleteMany() и insertMany() также подавляются при переносе во внутреннюю функцию, поэтому их результаты не "оцениваются слева".

...