Возвратите фактический тип поля в MongoDB

В MongoDB, с помощью $type, возможно отфильтровать поиск на основе того, если поле соответствует типу данных BSON (см. ДОКУМЕНТЫ).

Для, например.

db.posts.find({date2: {$type: 9}}, {date2: 1})

который возвращается:

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "date2" : "Fri Jul 09 2010 08:25:26 GMT" 
}

Мне нужен запрос, который скажет мне, каков фактический тип поля для каждого поля в наборе. Действительно ли это возможно с MongoDB?

15
задан styvane 26 June 2016 в 14:12
поделиться

1 ответ

Хорошо, вот некоторые связанные вопросы, которые могут помочь:

Получить все имена полей в коллекции с помощью map-reduce.

Вот рекурсивная версия, которая перечисляет все возможные поля.

Надеюсь, это поможет вам начать. Однако я подозреваю, что вы столкнетесь с некоторыми проблемами при выполнении этого запроса. Здесь есть две проблемы:

  1. Я не могу найти функцию "gettype" для JSON. Вы можете сделать запрос по $type, но не похоже, что вы можете запустить функцию gettype для поля, чтобы она вернулась к типу BSON.
  2. Поле может содержать данные нескольких типов, поэтому вам понадобится план, чтобы справиться с этим. Даже если это не очевидно, Mongo может хранить некоторые числа как ints, а другие - как float без вашего ведома. На самом деле, с драйвером PHP это вполне возможно.

Итак, если предположить, что вы можете решить проблему №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], ... }

Конечно, все это большая работа, в зависимости от вашей реальной проблемы, вы можете просто захотеть убедиться (из вашего кода), что вы всегда помещаете данные нужного типа. Поиск типа данных после того, как они находятся в БД, - это определенно боль.

7
ответ дан 1 December 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: