ОК, вот несколько связанных вопросов, которые могут помочь:
Получить все имена полей в коллекции, используя map-reduction.
Вот рекурсивная версия , в которой перечислены все возможные поля.
Надеюсь, это поможет вам начать. Однако я подозреваю, что с этим запросом у вас возникнут некоторые проблемы. Здесь есть две проблемы:
- Я не могу найти функцию "gettype" для JSON. Вы можете запросить по
$type
, но это не похоже на то, что вы действительно можете запустить функцию gettype
для поля и получить обратно в тип BSON.
- Поле может содержать данные нескольких типов, поэтому вам потребуется план для их обработки. Даже если это не очевидно, Монго может хранить некоторые числа в виде целых чисел и других чисел без вашего ведома. На самом деле, с драйвером PHP это вполне возможно.
Таким образом, если вы предполагаете, что можете решить проблему № 1, тогда вы сможете решить проблему № 2, используя небольшое изменение «Получить все имена полей» .
Вероятно, это будет выглядеть примерно так:
"map" : function() { for (var key in this) { emit(key, [ typeof value[key] ]); } }
"reduce" : function(key, stuff) { return (key, add_to_set(stuff) ); }
Таким образом, в основном вы бы выдавали key
и type of key value
(в виде массива) в функции карты. Затем из функции Reduce вы добавляете уникальные записи для каждого типа.
В конце цикла у вас будут такие данные
{"_id":[255], "name" : [1,5,8], ... }
Конечно, это много работы, в зависимости от вашей реальной проблемы, вы можете просто захотеть убедиться (из своего кода), что вы всегда вводите правильный тип данных. Поиск типа данных после того, как данные находятся в БД, определенно является проблемой.