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

Справочные документы с ObjectId при сохранении в мангусте

У меня есть следующие схемы:

// ingredient
var ingredSchema = new Schema({
  name: String,
  cost: Number
});

// order
var orderSchema = new Schema({
  cusName: String,
  ingredients: [{type: Schema.Types.ObjectId, ref: 'Ingredient'}]
});

// create model
var Ingredient = mongoose.model('Ingredient', ingredSchema);
var Order = mongoose.model('Order', orderSchema);

Я уже сохранил ингредиенты связки в коллекции ingredients и имею пользовательский интерфейс, где пользователи выбирают набор ингредиентов для своих гамбургеров. Затем я попытаюсь сохранить заказ для гамбургера в другой коллекции orders в пределах той же базы данных burgers, как это:

// get order info from the form
var newOrder = new Order({ cusName: req.body.name, 
                           ingredients: req.body.ingredients });
newOrder.save(function(err) {
    if (err)
        return console.log('Could not save your new order', err);
    res.redirect('/order');
});

Вызов сохранения заказа вызывает следующую ошибку:

{ message: Cast to ObjectId failed for value xxx at path 'ingredients',
  name: 'CastError',
  type: ObjectId,
  value: xxx,
  path: 'ingredients' }

Я использую версию мангуста 3.6.11. Пожалуйста, помогите мне взломать это.

PS: req.body.ingredients - это массив, построенный из флажков.

4b9b3361

Ответ 1

В вашем коде есть две проблемы:

1. req.body.ingredients не будет массивом ObjectId s, а mongoose хочет, чтобы все было в порядке (я сомневаюсь в этом).

Сначала вы должны отбросить каждый ингредиент до ObjectId. Предположим, что req.body.ingredients - массив, тогда вы сделаете что-то вроде этого:

var casted = req.body.ingredients.map(function( ingredient ) {
  return mongoose.Types.ObjectId(ingredient);
});

Я не тестировал это, посмотрим, будет ли это работать для вас.

2. Mongoose пытается использовать ваши ингредиенты, но один из них не является допустимым ObjectId

ObjectId должен состоять из 24 шестнадцатеричных символов, проверьте, передаете ли вы значения, подобные этому, в Mongoose.


Пожалуйста, опубликуйте результат, если один из них работает для вас:)