Ответ 1
Введите следующий запрос в редакторе /mongoshell
var col_list= db.emp.findOne();
for (var col in col_list) { print (col) ; }
вывод даст вам имя столбцов в коллекции:
_id
name
salary
Итак, это День 3 обучения Mongo Db. Я иду из вселенной MySql...
Много раз, когда мне нужно написать запрос для таблицы MySql, с которой я не знаком, я бы использовал команду "desc" - в основном, рассказывая мне, какие поля я должен включить в свой запрос.
Как мне сделать это для Mongo db? Я знаю, я знаю... Я ищу схему в базе данных без схемы. =) Но как еще пользователи узнают, какие поля использовать в своих запросах?
Неужели я ошибаюсь? Очевидно, я пытаюсь использовать способ MySql делать вещи в Mongo db. Что такое монгольский путь?
Введите следующий запрос в редакторе /mongoshell
var col_list= db.emp.findOne();
for (var col in col_list) { print (col) ; }
вывод даст вам имя столбцов в коллекции:
_id
name
salary
Здесь нет хорошего ответа. Поскольку схемы нет, вы не можете "описать" коллекцию. Однако во многих (наиболее?) Приложениях MongoDb схема определяется структурой иерархии объектов, используемой в приложении для написания (java или С# или что-то еще), поэтому вы можете отразить библиотеку объектов для получения этой информации, В противном случае есть несколько проб и ошибок.
Это мой день 30 или что-то вроде игры с MongoDB. К сожалению, мы переключились обратно на MySQL после работы с MongoDB из-за проблем с текущей инфраструктурой моей компании. Но, реализовав ту же модель как в MongoDB, так и в MySQL, я теперь ясно вижу разницу.
Конечно, существует схема, используемая при работе с базами данных без схемы, такими как MongoDB, но схема продиктована приложением, а не базой данных. База данных будет зависеть от того, что она дана. До тех пор, пока вы знаете, что администраторы не тайно регистрируются в Mongo и вносят изменения, и весь доступ к базе данных является контроллером через некоторую обертку, единственное место, которое вы должны посмотреть на для схемы - ваши классы моделей. Например, в нашем Rails-приложении это две из моделей, которые мы имеем в Mongo,
class Consumer
include MongoMapper::Document
key :name, String
key :phone_number, String
one :address
end
class Address
include MongoMapper::EmbeddedDocument
key :street, String
key :city, String
key :state, String
key :zip, String
key :state, String
key :country, String
end
Теперь, после переключения на MySQL, наши классы выглядят так:
class Consumer < ActiveRecord::Base
has_one :address
end
class Address < ActiveRecord::Base
belongs_to :consumer
end
Не обманывайтесь кратностью классов. В последней версии с MySQL поля извлекаются из базы данных напрямую. В первом примере поля находятся прямо перед нашими глазами.
С MongoDB, если мы должны были изменить определенную модель, мы просто добавляем, удаляем или модифицируем поля в самом классе, и это работает сразу же с места. Нам не нужно беспокоиться о сохранении таблиц/столбцов базы данных в синхронизации с структурой класса. Поэтому, если вы ищете схему в MongoDB, посмотрите на приложение для ответов, а не на базу данных.
По существу, я говорю точно так же, как @Chris Shain:)
У меня тоже была эта потребность, Кавахон. Поэтому я создал инструмент с открытым исходным кодом под названием Variety, который выполняет именно это: ссылка
Надеюсь, вы найдете его полезным. Сообщите мне, есть ли у вас вопросы или какие-либо вопросы, связанные с этим.
Удачи!
AFAIK, нет способа, и логично, чтобы это было так.
MongoDB, не имеющий схемы, позволяет одной коллекции иметь документы с разными полями. Таким образом, не может быть описания коллекции, например описания таблицы в реляционных базах данных.
Хотя это так, большинство приложений поддерживают схему для своих коллекций, и, как сказал Крис, это применяется вашим приложением.
Таким образом, вам не придется беспокоиться о том, чтобы сначала получить доступные ключи для запроса. Вы можете просто спросить MongoDB для любого набора ключей (например, проекционной части запроса) или запроса на любой набор ключей. В обоих случаях, если указанные ключи существуют в документе, они используются, иначе они не будут. Вы не получите никаких ошибок.
Например (на оболочке mongo):
Если это образец документа в вашей коллекции people
, и все документы следуют той же схеме:
{
name : "My Name"
place : "My Place"
city : "My City"
}
Ниже приведены совершенно правильные запросы:
Эти два возвращают вышеуказанный документ:
db.people.find({name : "My Name"})
db.people.find({name : "My Name"}, {name : 1, place :1})
Это ничего не вернет, но также не приведет к ошибке:
db.people.find({first_name : "My Name"})
Это будет соответствовать указанному выше документу, но у вас будет только свойство "_id" по умолчанию для возвращаемого документа.
db.people.find({name : "My Name"}, {first_name : 1, location :1})
Фактически правильно, вы все делаете это слишком сложно. Я думаю, что ОП просто хочет знать, как выглядят его/ее данные. Если это случай, вы можете просто
db.collectionName.findOne()
Это отобразит один документ (ака. запись) в базе данных в симпатичном формате.
Если вы в порядке с запуском Map/Reduce, вы можете собрать все возможные поля документа.
Начните с этого сообщения.
Единственная проблема заключается в том, что вы используете Map/Reduce, на котором может быть ресурсоемкой. Вместо этого, как предложили другие, вы захотите посмотреть на код, который записывает фактические данные.
Просто потому, что база данных не имеет схемы, не означает, что нет схемы. Вообще говоря, информация о схеме будет в коде.
Я написал небольшую оболочку mongo script, которая может вам помочь. https://gist.github.com/hkasera/9386709
Сообщите мне, если это поможет.
print('\n--->', Object.getOwnPropertyNames(db.users.findOne())
.toString()
.replace(/,/g, '\n---> ') + '\n');
---> _id
---> firstName
---> lastName
---> email
---> password
---> terms
---> confirmed
---> userAgent
---> createdAt
Вы можете использовать инструмент mongo для интерфейса пользователя для mongoDb. Это показывает все поля в этой коллекции, а также показывает изменение данных в нем.
Если вы используете NodeJS и хотите получить все имена полей с помощью запроса API, этот код работает для меня -
let arrayResult = [];
db.findOne().exec(function (err, docs)){
if(err)
//show error
const JSONobj = JSON.parse(JSON.stringify(docs));
for(let key in JSONobj) {
arrayResult.push(key);
}
return callback(null, arrayResult);
}
МассивResult даст вам целые имена полей/столбцов
Вывод -
[
"_id",
"emp_id",
"emp_type",
"emp_status",
"emp_payment"
]
Надеюсь, это сработает для вас!