mongo dbname --eval 'db.collection.find ()' не работает - PullRequest
20 голосов
/ 08 сентября 2011

Почему это работает:

# mongo dbname
MongoDB shell version: 1.8.3
connecting to: nextmuni_staging
> db.collection.find()
{ "foo" : "bar" }
> bye

Пока это не работает:

# mongo localhost/dbname --eval 'db.collection.find()'
MongoDB shell version: 1.8.3
connecting to: localhost/dbname
DBQuery: dbname.collection -> undefined

Это должно быть точно так же, нет?

Спасибо!

Ответы [ 2 ]

24 голосов
/ 09 марта 2012

Возвращаемое значение db.collection.find() относится к типу курсора. Выполнение этой команды из оболочки создаст курсор и покажет вам первую страницу данных. Остальное можно начать, повторив команду «it».

Я думаю, что область действия переменных, используемых во время выполнения сценария eval'd, предназначена только для времени жизни сценария (данные могут быть сохранены в коллекции, конечно), поэтому, как только сценарий завершает работу, эти переменные курсора больше не существуют, и поэтому Вы могли бы отправить еще один сценарий Eval для страницы данных. Таким образом, поведение, которое вы получаете во время сеанса оболочки, на самом деле не будет работать из сценария eval.

Чтобы приблизиться к поведению, вы можете запустить что-то вроде этого:

mongo dbname --eval "db.collection.find().forEach(printjson)"

Это показывает, что команда действительно выполняется и создает курсор, который затем можно перебрать, отправив вывод в stdout.

Редактировать: Я думаю, что я пытался подчеркнуть, что команда, которую вы выполняете, работает, просто вывод не соответствует вашим ожиданиям.

2 голосов
/ 10 января 2017

Функции printjson охватывают большую часть сценариев с mongo --eval '...'. Вместо цепочки .forEach вы можете просто обернуть ваш звонок.

$ mongo --eval 'db.stats_data.stats()' db_name
MongoDB shell version: 2.4.14
connecting to: db_name
[object Object]

$ mongo --eval 'db.stats_data.stats().forEach(printjson)' db_name
MongoDB shell version: 2.4.14
connecting to: db_name
Tue Jan 10 15:32:11.961 TypeError: Object [object Object] has no method 'forEach'

$ mongo --eval 'printjson(db.stats_data.stats())' db_name
MongoDB shell version: 2.4.14
connecting to: db_name
{
    "ns" : "db_name.stats_data",
    "count" : 5516290,
    "size" : 789938800,
    "avgObjSize" : 143.20110073980882,
    "storageSize" : 1164914688,
    "numExtents" : 18,
    "nindexes" : 3,
    "lastExtentSize" : 307515392,
    "paddingFactor" : 1.0000000000000457,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 1441559616,
    "indexSizes" : {
        "_id_" : 185292688,
        "owner_id_key_idx" : 427678384,
        "onwer_metric_key_idx" : 828588544
    },
    "ok" : 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...