Подтвердить что ты не робот

Как описать коллекцию в Монго?

Итак, это День 3 обучения Mongo Db. Я иду из вселенной MySql...

Много раз, когда мне нужно написать запрос для таблицы MySql, с которой я не знаком, я бы использовал команду "desc" - в основном, рассказывая мне, какие поля я должен включить в свой запрос.

Как мне сделать это для Mongo db? Я знаю, я знаю... Я ищу схему в базе данных без схемы. =) Но как еще пользователи узнают, какие поля использовать в своих запросах?

Неужели я ошибаюсь? Очевидно, я пытаюсь использовать способ MySql делать вещи в Mongo db. Что такое монгольский путь?

4b9b3361

Ответ 1

Введите следующий запрос в редакторе /mongoshell

var col_list= db.emp.findOne();
for (var col in col_list) { print (col) ; }

вывод даст вам имя столбцов в коллекции:

_id
name
salary

Ответ 2

Здесь нет хорошего ответа. Поскольку схемы нет, вы не можете "описать" коллекцию. Однако во многих (наиболее?) Приложениях MongoDb схема определяется структурой иерархии объектов, используемой в приложении для написания (java или С# или что-то еще), поэтому вы можете отразить библиотеку объектов для получения этой информации, В противном случае есть несколько проб и ошибок.

Ответ 3

Это мой день 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:)

Ответ 4

У меня тоже была эта потребность, Кавахон. Поэтому я создал инструмент с открытым исходным кодом под названием Variety, который выполняет именно это: ссылка

Надеюсь, вы найдете его полезным. Сообщите мне, есть ли у вас вопросы или какие-либо вопросы, связанные с этим.

Удачи!

Ответ 5

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})

Ответ 6

Фактически правильно, вы все делаете это слишком сложно. Я думаю, что ОП просто хочет знать, как выглядят его/ее данные. Если это случай, вы можете просто

db.collectionName.findOne()

Это отобразит один документ (ака. запись) в базе данных в симпатичном формате.

Ответ 7

Если вы в порядке с запуском Map/Reduce, вы можете собрать все возможные поля документа.

Начните с этого сообщения.

Единственная проблема заключается в том, что вы используете Map/Reduce, на котором может быть ресурсоемкой. Вместо этого, как предложили другие, вы захотите посмотреть на код, который записывает фактические данные.

Просто потому, что база данных не имеет схемы, не означает, что нет схемы. Вообще говоря, информация о схеме будет в коде.

Ответ 8

Я написал небольшую оболочку mongo script, которая может вам помочь. https://gist.github.com/hkasera/9386709

Сообщите мне, если это поможет.

Ответ 9

print('\n--->', Object.getOwnPropertyNames(db.users.findOne())
  .toString()
  .replace(/,/g, '\n---> ') + '\n');

---> _id
---> firstName
---> lastName
---> email
---> password
---> terms
---> confirmed
---> userAgent
---> createdAt

Ответ 10

Вы можете использовать инструмент mongo для интерфейса пользователя для mongoDb. Это показывает все поля в этой коллекции, а также показывает изменение данных в нем.

Ответ 11

Если вы используете 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"
]

Надеюсь, это сработает для вас!