mongo --shell file.js и оператор использования

не могу найти решение простого вопроса:

У меня есть файл text.js

use somedb
db.somecollection.findOne()

Когда я запускаю этот файл в cmd с командой перенаправления из файла: "mongo ‹ text.js"

это работает правильно

Но когда я пытаюсь таким образом

"mongo text.js" или "mongo --shell test.js"

Я получил это сообщение об ошибке

Версия оболочки MongoDB: 2.2.0. перед оператором pathToFile\test.js.js:1 не удалось загрузить: pathToFile\test.js.js

Ошибка при использовании somedb. Если я удалю эту строку, она запустится без ошибок, но консоль будет чистой.

есть идеи, что это и как исправить?

Я пытаюсь найти решение для этого, чтобы создать инструмент сборки для Sublime Text 2. Файл сборки по умолчанию был

{
"cmd": ["mongo","$file"]
}

но в этом случае я получаю ошибку выше

PS. сразу после публикации этого вопроса я нашел решение для SublimeText2:

{
"selector": "source.js",
"shell":true,
"cmd": ["mongo < ${file}"]
}

ПСС. сразу после публикации этого вопроса я нашел решение для SublimeText3:

{
"selector": "source.js",
"shell":true,
"cmd": ["mongo","<", "$file"]
}

этот инструмент сборки работает правильно


person VitVad    schedule 05.12.2012    source источник
comment
Я пытаюсь найти решение для создания инструмента сборки для Sublime Text 2.   -  person VitVad    schedule 05.12.2012


Ответы (4)


use dbname — это вспомогательная функция в интерактивной оболочке, которая не работает, когда вы используете оболочку mongo с файлом сценария JS, как и вы.

Есть несколько решений для этого. Лучше всего, IMO, явно передать имя БД вместе с именем хоста и порта в монго следующим образом:

mongo hostname:27017/dbname mongoscript.js // замените 27017 на номер вашего порта

Лучшим способом сделать это было бы определить БД в начале вашего скрипта:

mydb=db.getSiblingDB("yourdbname");
mydb.collection.findOne();
etc.

Последнее предпочтительнее, так как позволяет вам взаимодействовать с несколькими БД в одном скрипте, если вам это нужно.

person Asya Kamsky    schedule 05.12.2012
comment
Да, просто примечание: для полного сопоставления вспомогательных команд оболочки mongo и их эквивалентов JS, которые можно использовать в файле сценария js, см. документацию mongo: docs.mongodb.org/manual/tutorial/ - person Miroslav Mocek; 09.01.2015

Вы можете указать базу данных при запуске клиента mongo:

mongo somedb text.js

Чтобы получить вывод от клиента на стандартный вывод, просто используйте функцию printjson в вашем скрипте:

printjson(db.somecollection.findOne());
person Stefan Podkowinski    schedule 05.12.2012
comment
Идея была указать db в js файле. Я видел эту инициализацию оболочки монго раньше. Что касается printjson thx, но также существует некоторая проблема. Когда мы запускаем printjson(db.somecollection.findOne()); получаем результат. Когда мы пытаемся запустить printjson(db.somecollection.find()); кажется, что он печатает весь объект курсора, но не результат. Без printjson ничего не вернуть. - person VitVad; 05.12.2012
comment
Вы можете просто повторить результат в цикле while в своем скрипте и вызвать printjson для каждого отдельного объекта: while (cursor.hasNext()) printjson(cursor.next()); - person Stefan Podkowinski; 05.12.2012

Mongo нужно вызывать из оболочки, чтобы получить этот режим, с Ansible у вас будет это:

- name: mongo using different databases
  action: shell /usr/bin/mongo < text.js

Вместо этого:

- name: mongo breaking
  command: /usr/bin/mongo < text.js
person bbaassssiiee    schedule 24.01.2014

Это то, что наконец сработало для меня в Windows + Sublime Text 2 + MongoDB 2.6.5

{
    "selector": "source.js",
    "shell":true,
    "cmd": ["mongo","<", "$file"],
    "working_dir" : "C:\\MongoDB\\bin"
} 
person Sanket Sonavane    schedule 05.12.2014