У меня есть схема Parent:
const parentSchema = new Schema({
name: {
type: String,
},
children: [{
type: Schema.Types.ObjectId,
ref: "Children"
}]
})
А это схема Children:
const childrenSchema = Schema({
name: {
type: String
},
surname: {
type: String
}
})
У меня есть входящий запрос регистрации пользователя POST в следующем формате:
{
"name": "TEST",
"children" : [
{ "name":"test","surname": "test" },
{ "name":"test","surname": "test" }
]
}
Вот роутер:
router.post("/register", (req, res, next) => {
const {name, children} = req.body;
let newParent = newParent({
name,
children
});
newParent.save((err, result) => {
// res.send(result) etc.
})
}
Это приводит к следующей ошибке:
Cast to Array failed for value "[ { name: 'test', surname: 'test' } ]" at path "children"
Как я могу сохранить все children и оставить в ref только дочерние _id, чтобы позже я мог populate коллекцию Parent?





Поле дочерних элементов в родительском элементе ожидает массивы ObjectIds, но вы передаете ему массивы объектов, которые не соответствуют этому ожиданию. Пожалуйста, попробуйте сохранить дочерние элементы, получить идентификаторы, а затем использовать эти идентификаторы для заполнения дочернего поля в родительском документе. Что-то вроде ниже:
children.save()
.then(results => {
childrenids = []
results.foreach[item => childrenids.push(result._id)]
newParent.children = chilrenids
newParent.save()
.then(results => res.send({results})
})To save childData in Parents, You need to save first child's data in children schema Then get childIds and save to Parent Data.
Рабочий пример:
let req = {
"name" : "TEST",
"children" : [
{ "name":"test","surname": "test" },
{ "name":"test","surname": "test" }
]
}
Children.collection.insert(req.children, function (err, docs) {
if (err){
conasolw.log(err);
} else {
var ids = docs.ops.map(doc=>{ return doc._id});;
console.info(ids);
let newParent = Parent({
name : req.name,
children : ids
});
newParent.save((err, result) => {
console.info('parent save');
console.info(err);
console.info(result);
})
}
});
Примечание :
Test on
"mongoose": "^5.3.3"
Чище, чем принятый ответ. Однако вы можете еще больше упростить его, используя
mapвместоforEach. ==>newParent.children = results.map(x => x._id);