В MongoDB, с помощью $type
, возможно отфильтровать поиск на основе того, если поле соответствует типу данных BSON (см. ДОКУМЕНТЫ).
Для, например.
db.posts.find({date2: {$type: 9}}, {date2: 1})
который возвращается:
{
"_id" : ObjectId("4c0ec11e8fd2e65c0b010000"),
"date2" : "Fri Jul 09 2010 08:25:26 GMT"
}
Мне нужен запрос, который скажет мне, каков фактический тип поля для каждого поля в наборе. Действительно ли это возможно с MongoDB?
Хорошо, вот некоторые связанные вопросы, которые могут помочь:
Получить все имена полей в коллекции с помощью map-reduce.
Вот рекурсивная версия, которая перечисляет все возможные поля.
Надеюсь, это поможет вам начать. Однако я подозреваю, что вы столкнетесь с некоторыми проблемами при выполнении этого запроса. Здесь есть две проблемы:
$type
, но не похоже, что вы можете запустить функцию gettype
для поля, чтобы она вернулась к типу BSON. Итак, если предположить, что вы можете решить проблему №1, то вы должны быть в состоянии решить проблему №2, используя небольшую вариацию на тему "Get all field Names".
Это, вероятно, будет выглядеть примерно так:
"map" : function() { for (var key in this) { emit(key, [ typeof value[key] ]); } }
"reduce" : function(key, stuff) { return (key, add_to_set(stuff) ); }
Итак, в основном вы передадите ключ
и тип значения ключа
(как массив) в функции map. Затем из функции reduce вы добавите уникальные записи для каждого типа.
В конце выполнения у вас будут такие данные
{"_id":[255], "name" : [1,5,8], ... }
Конечно, все это большая работа, в зависимости от вашей реальной проблемы, вы можете просто захотеть убедиться (из вашего кода), что вы всегда помещаете данные нужного типа. Поиск типа данных после того, как они находятся в БД, - это определенно боль.