Я хотел бы получить имена всех ключей в коллекции MongoDB.
Например, из этого:
db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] } );
db.things.insert( { hello : [] } );
Я хотел бы получить уникальные ключи:
type, egg, hello
for (var key in this.first_level.second_level.nth_level) { emit(key, null); }
db.runCommand({..., out: { "inline" : 1 }}).results.map(function(i) { return i._id; });
С ответом Кристины в качестве вдохновения я создал инструмент с открытым исходным кодом под названием Variety, который делает именно это: https://github.com/variety/variety.
источник
Вы можете использовать агрегацию с новым
$objectToArrray
в3.4.4
версии , чтобы преобразовать все верхний ключ & пару значений в массивы документов с последующими$unwind
&$group
с ,$addToSet
чтобы получить различные ключи через всю коллекцию.$$ROOT
для ссылки на документ верхнего уровня.Вы можете использовать приведенный ниже запрос для получения ключей в одном документе.
источник
.next()["allkeys"]
команду (при условии, что в коллекции есть хотя бы один элемент).Попробуй это:
источник
Если ваша целевая коллекция не слишком велика, вы можете попробовать это в клиенте оболочки mongo:
источник
Очищенное и многоразовое решение с использованием пимонго:
Использование:
источник
if (typeof(this[key]) == 'number')
преждеemit(key, null)
.Использование Python. Возвращает набор всех ключей верхнего уровня в коллекции:
источник
Вот пример, сработавший в Python: этот пример возвращает результаты в строке.
источник
Если вы используете mongodb 3.4.4 и выше, вы можете использовать агрегацию ниже, используя
$objectToArray
и$group
агрегациюВот рабочий пример
источник
$match
в начале конвейера агрегации только для получения ключей документов, которые соответствуют условию (ам).Я удивлен, ни у кого здесь нет ответов с использованием simple
javascript
иSet
логики для автоматической фильтрации значений дубликатов, простой пример для оболочки mongo, как показано ниже:Это напечатает все возможные уникальные ключи в имени коллекции: collectionName .
источник
Это прекрасно работает для меня:
источник
Я думаю, что лучший способ сделать это, как упомянуто здесь , в mongod 3.4.4+, но без использования
$unwind
оператора и использования только двух этапов в конвейере. Вместо этого мы можем использовать$mergeObjects
и$objectToArray
оператор.На
$group
этапе мы используем$mergeObjects
оператор для возврата одного документа, где ключ / значение взяты из всех документов в коллекции.Затем приходит то,
$project
где мы используем$map
и$objectToArray
вернуть ключи.Теперь, если у нас есть вложенные документы и мы хотим получить ключи, это выполнимо. Для простоты рассмотрим документ с простым встроенным документом, который выглядит следующим образом:
Следующий конвейер выдает все ключи (field1, field2, field3, field4).
Приложив немного усилий, мы можем получить ключ для всего поддокумента в поле массива, где элементы также являются объектами.
источник
$unwind
взорвет коллекцию (no.of fields * no.of docs), мы можем избежать этого, используя$mergeObjects
на всех версиях>3.6
.. Сделал то же самое, Если бы видел этот ответ раньше, моя жизнь была бы проще в этом смысле ( -_-)Может быть, немного не по теме, но вы можете рекурсивно распечатать все ключи / поля объекта:
Полезно, когда все объекты в коллекции имеют одинаковую структуру.
источник
Чтобы получить список всех ключей минус
_id
, рассмотрите возможность запуска следующего агрегатного конвейера:источник
Я пытался написать в nodejs и, наконец, придумал это:
После прочтения вновь созданной коллекции "allFieldNames" удалите ее.
источник
Согласно документации mongoldb , комбинация
distinct
и операции сбора индексов - это то, что возвращает все возможные значения для данного ключа или индекса:
Таким образом, в данном методе можно использовать метод, подобный следующему, для запроса коллекции для всех ее зарегистрированных индексов и возврата, скажем, объекта с индексами для ключей (в этом примере используется async / await для NodeJS, но очевидно, вы можете использовать любой другой асинхронный подход):
Таким образом, запрос коллекции с базовым
_id
индексом вернет следующее (тестовая коллекция имеет только один документ на момент теста):Имейте в виду, это использует методы, родные для драйвера NodeJS. Как предлагали некоторые другие ответы, существуют и другие подходы, такие как совокупная структура. Лично я нахожу этот подход более гибким, так как вы можете легко создавать и настраивать способы возврата результатов. Очевидно, что это касается только атрибутов верхнего уровня, а не вложенных. Кроме того, чтобы гарантировать, что все документы представлены, если есть вторичные индексы (кроме основного _id), эти индексы должны быть установлены как
required
.источник
Мы можем добиться этого, используя mongo js file. Добавьте следующий код в ваш файл getCollectionName.js и запустите файл js в консоли Linux, как показано ниже:
Спасибо @ackuser
источник
Следуя ветке ответа @James Cropcho, я обнаружил следующее, что оказалось очень простым в использовании. Это бинарный инструмент, который именно то, что я искал: mongoeye .
Используя этот инструмент, потребовалось около 2 минут, чтобы экспортировать мою схему из командной строки.
источник
Я знаю, что этому вопросу 10 лет, но нет решения C #, и мне потребовались часы, чтобы понять. Я использую драйвер .NET и
System.Linq
возвращаю список ключей.источник
Я немного расширил решение Carlos LM, чтобы оно было более подробным.
Пример схемы:
Введите в консоли:
Бегать:
Вывод
источник
У меня есть 1 более простая работа вокруг ...
Что вы можете сделать, вставляя данные / документ в основную коллекцию «вещей», вы должны вставить атрибуты в 1 отдельную коллекцию, скажем, «things_attributes».
поэтому каждый раз, когда вы вставляете в "вещи", вы получаете из "вещи_атрибуты" сравниваете значения этого документа с вашими новыми ключами документа, если какой-либо новый присутствующий ключ добавляет его в этот документ и снова повторно вставляет его.
Таким образом, things_attributes будет иметь только 1 документ с уникальными ключами, которые вы можете легко получить, когда захотите, используя findOne ()
источник