Подтвердить что ты не робот

Есть ли встроенная функция для преобразования JSON на основе строк в экземпляр объекта Mongoose Schema?

Я использую Express, и я ищу удобный способ преобразования такого объекта (который приходит по запросу req.body.myObject):

{
  "name": "Foo",
  "someNumber": "23",
  "someBoolean": "on"
}

В экземпляр этой схемы:

var myObjectSchema = new Schema({
    name: String,
    someNumber: Number,
    someBoolean: Boolean
});

Обратите внимание, что первый объект поступает из запроса, поэтому его полностью выполняет Strings.

Есть ли хороший способ достичь этого? Если нет, можете ли вы предложить какие-либо рекомендации по реализации этой функции в качестве промежуточного программного обеспечения?

4b9b3361

Ответ 1

Обращаясь к этому потоку Mongoose: вставляем JS-объект непосредственно в db Я понял, что да, это встроенная функция для этого.

Вы просто создаете новую модель, передающую значения запроса (из формы) в качестве параметров:

function add(req, res){
    new Contact(req.body.contact).save(function(err){
        console.log("Item added");
        res.send();
    });
};

Он автоматически преобразует материал для вас!

Ответ 2

Я знаю, что этот ответ уже принят, но я хотел указать, что мангуст позаботится о большей части кастинга для вас... большую часть времени. Хотя это удобно, что мангуста делает это, он абстрагирует истинное поведение манго. Например, mongoose позволяет вам сделать что-то вроде этого:

PersonModel.findById("4cdf00000000000000007822", ...);

Однако, если вы попытались напрямую запросить базу данных (без mongoose), это будет не:

PersonCollection.find({_id: "4cdf00000000000000007822"}, ...);

Это потому, что ObjectIds не являются строками... они являются объектами. Внутри mongoose преобразует эту строку в ObjectId, а затем выполняет запрос к базе данных, так что окончательный запрос выглядит примерно так:

PersonCollection.find({_id: ObjectId("4cdf00000000000000007822")}, ...);

Кроме того, каждый путь в схеме имеет метод "заклинаний". Это частный метод, но он подходит, когда вам это нужно. ПОЖАЛУЙСТА, ОБРАТИТЕСЬ, ЧТО МЕТОДЫ caster, ОПИСАННЫЕ НИЖЕ, НЕ УКАЗЫВАЮТСЯ И МОГУТ ИЗМЕНИТЬ БЕЗ ПРЕДУПРЕЖДЕНИЯ. ИСПОЛЬЗУЙТЕ СВОЙ СОБСТВЕННЫЙ РИСК (извините за крик):

// Use PersonModel.schema.paths() to get all paths and loop over them if you want
var key = "name";
var pathObj = PersonModel.schema.path( key );
if( !pathObj ) pathObj = PersonModel.schema.virtualpath( key );
if( !pathObj ) { /* not found: return, continue, exit, whatever */ }

// UNDOCUMENTED: USE AT YOUR OWN RISK
var caster = pathObj.caster || pathObj;
var castedValue = caster.cast( req.body.name );

Почему я знаю это? Поскольку, если вы хотите использовать некоторые из более продвинутых функций монго, таких как агрегация, вам нужно будет использовать свои собственные значения при построении конвейера. Мне также необходимо вручную отличать значения для определенных запросов, которые использовали оператор $in... возможно, это больше не нужно. Точка, если у вас возникли проблемы с получением ожидаемых результатов, попробуйте сами лить значения.

Ответ 3

Если схема статична, теоретически может идти ленивый, не сложный способ и просто жестко задавать значения вместо передачи самого объекта:

var someObject = {
    name: "Foo",
    someNumber: "23",
    someBoolean: "on"
}

var myObjectSchema = new Schema({
    name: someObject.name,
    someNumber: parseInt(someObject.someNumber, 10),
    someBoolean: (someObject.someBoolean == "on")
});

Возможно, это не тот ответ, который вы искали, но может быть что-то рассмотреть, если ничего лучше не доступно.