Дополнительно
Получить имена всех ключей в коллекции
Я'хочу получить имена всех ключей в коллекции MongoDB.
Например, из этого:
db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] } );
db.things.insert( { hello : [] } );
Я'хочу получить уникальные ключи:
type, egg, hello
299
20
Это можно сделать с помощью MapReduce:
Затем выполнить distinct на полученной коллекции, чтобы найти все ключи:
Вдохновившись ответом Kristina'answer, я создал инструмент с открытым исходным кодом под названием Variety, который делает именно это: https://github.com/variety/variety
Вы можете использовать агрегацию с новыми
$objectToArrray
в3.4.4
версия для преобразования всех ключевых & стоимость пара в документ массивов и$расслабиться
&ампер;$группа
с$addToSet
для получения разных ключей через всю коллекцию.$$Корень
для ссылок на верхнем уровне документа.Вы можете использовать ниже запроса на получение ключей в одном документе.
Попробуйте сделать это:
Если ваша цель набор не слишком большой, можно попробовать под клиента монго оболочки:
С помощью Python. Возвращает набор всех верхнего уровня ключи в коллекции:
Вот образец работал в Python: Этот пример возвращает результаты рядный.
Очищенная и раствор многоразовый с помощью pymongo:
Использование:
Если вы используете в MongoDB 3.4.4 и выше, то вы можете использовать ниже статистической обработки с помощью
$objectToArray
и$группа
агрегацииВот рабочая Пример
Я удивлению, никто здесь Анс с помощью простой "Javascript" и "набор" логика для автоматической фильтрации значений дубликаты, простой пример на монго оболочки, как показано ниже:
Это позволит напечатать все это возможно ключи во имя семейство: имя_коллекции.
Это прекрасно работает для меня:
Чтобы получить список всех ключей минус
параметр _id
, попробуйте выполнить следующие агрегатные трубопровода:Я думаю, что лучший способ сделать это, как упоминалось здесь в команду mongod 3.4.4+, но без использования оператора
$расслабиться и используя только две стадии в конвейере. Вместо этого мы можем использовать [
$mergeObjects][2] и [
$objectToArray`]3 операторы.В этапе
$Group
, а мы используем оператор$mergeObjects
, чтобы получить один документ, где ключ/значение из всех документов в коллекции.Затем идет$проект `
где мы используем
$картаи
$objectToArray`, чтобы вернуть ключи.Теперь, если у нас есть вложенные документы и хотят получить ключи как хорошо, это выполнимо. Для простоты, давайте рассмотрим документ с простой внедренный документ, который выглядит так:
Следующий газопровод даст все ключи (поле1, поле2, поле3, поле4).
Приложив немного усилий, мы можем получить ключ для всех вложенного документа в поле массива, где элементы объекта, а также.
Следующую нить с @Джеймс Cropcho'ы ответ, я приземлился на следующий, который я нашел, чтобы быть очень проста в использовании. Это бинарный инструмент, который является точно, что я искал: mongoeye.
Используя этот инструмент, потребовалось около 2 минут, чтобы сделать мои схемы экспортирована из командной строки.
Я пытался писать на nodejs и, наконец, придумал:
После прочтения недавно созданная коллекция "и allFieldNames и", удалить его.
В соответствии с mongoldb документация, сочетание
четкая
и индексы операции по сбору данных, что бы вернуть все возможные значения для данного ключа или индекса:
Поэтому в данный способ можно использовать метод, таким образом, для того, для запроса коллекции для всех это'ы регистрируемые показатели, и вернуться, скажем, объект с индексами для ключей (в этом примере используется асинхронный/ждут NodeJS, но, очевидно, вы можете использовать любой другой асинхронный подход):
Такой запрос коллекция с индекс основной параметр _id`, вернется в следующем (сборник тестов только один документ на момент теста):
Заметь, это использует методы родным для водителя NodeJS. Как и некоторые другие ответы предложили, есть и другие подходы, такие как совокупные структуры. Я лично считаю такой подход более гибок, так как вы можете с легкостью создать и отладить, как возвращать результаты. Очевидно, это касается лишь высшего уровня качества, но не вложенные. Также, чтобы гарантировать, что все документы должны быть вторичные индексы (кроме основной параметр _id один), эти индексы должны быть установлены как "требуется".
Может быть немного не по теме, но вы можете рекурсивно довольно-напечатать все ключи/поля объекта:
Полезно, когда все объекты в коллекции, имеет одинаковую структуру.
Мы можем добиться этого, используя файл монго в JS. Добавить ниже код в ваш getCollectionName.js файл Файл и запустить JS в консоли Linux, как приведенный ниже :
Спасибо @ackuser
Я протянул Карлос ЛМ'ный раствор немного так это's более подробно.
Пример схемы:
Введите в консоли:
Выполнить:
Выход
У меня есть 1 проще обойти...
Что вы можете сделать, это при вставке данных/документы на ваш основной сбор на "вещи" Вы должны вставить атрибуты в 1 отдельной коллекции позволяет сказать: "things_attributes и".
поэтому каждый раз, когда вы вставляете в "вещи" и, вы получите от "things_attributes" и сравнивать значения этого документа с новым документом ключей, если любые новые разделы добавить его в документ и снова вставьте его.
Так things_attributes будет только 1 документ уникальных ключей, которые вы можете легко узнать, когда вам требуется с помощью findOne()