Node.js 猫鼬不';t保存嵌套的子文档
我需要在模式中保存一些子文档,该模式是模式的子文档。 保存功能如下所示:Node.js 猫鼬不';t保存嵌套的子文档,node.js,mongodb,mongoose,subdocument,Node.js,Mongodb,Mongoose,Subdocument,我需要在模式中保存一些子文档,该模式是模式的子文档。 保存功能如下所示: exports.add = function(req, res){ var cliente = new Cliente(req.body); var sedi = []; for(var key in req.body.sede){ var sede = new Sede(req.body.sede[key]); var luoghi_consegna_sedi = []; for(jey i
exports.add = function(req, res){
var cliente = new Cliente(req.body);
var sedi = [];
for(var key in req.body.sede){
var sede = new Sede(req.body.sede[key]);
var luoghi_consegna_sedi = [];
for(jey in req.body.sede[key].lcs){
var luogo_consegna_sede = new LuoghiConsegnaSede(req.body.sede[key].lcs[jey]);
//Sub document
luoghi_consegna_sedi.push(luogo_consegna_sede);
}
sede.luoghi_consegna_sedi = luoghi_consegna_sedi;
//Sub docuemnt
sedi.push(sede);
}
cliente.sedi = sedi;
cliente.save(function(err){
if(err)
return res.sendStatus(400);
return res.json(cliente);
});
};
问题是顶级父模式(cliente)保存在mongoldb上,而这两种类型的子文档不保存。在cliente.sedi中,数组用sede objectid填充,但在mongoldb中,sede表不存在(对于luoghi_consegna_sedi也是如此)。
如果我在将sede和luoghi_consegna_sedi放入数组之前手动保存它们,则会创建这两个表并填充数据,但如果我在cliente.sedi上运行populate(),则会得到一个空数组。
这三种模式是:
客户
塞德
洛吉·康塞格纳·塞迪
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var LuoghiConsegnaSedeSchema = new Schema({
titolo_rif: String,
cognome: String,
nome: String,
tipo_sede_consegna: String,
sede_consegna: String,
telefono_1: String,
telefono_2: String,
cellulare_rif: String,
email_rif: String,
telefono_rif: String,
tipo_indirizzo_consegna: String,
indirizzo_consegna: String,
n_civico_consegna: String,
piano_consegna: String,
interno_consegna: String,
scala_consegna: String,
citofonare_consegna: String,
citta_consegna: String,
provincia_consegna: String,
regione_consegna: String,
cap_consegna: String,
paese_consegna: String,
eliminato: {
type: Boolean,
default: false
},
created: {
type: Date,
default: Date.now
}
});
LuoghiConsegnaSedeSchema.set('toJSON', {getters: true});
mongoose.model('LuoghiConsegnaSede', LuoghiConsegnaSedeSchema);
您的问题是将引用保存到其他文档
cliente.sedi = [];
for(var key in req.body.sede){
var sede = new Sede(req.body.sede[key]);
var luoghi_consegna_sedi = [];
for(jey in req.body.sede[key].lcs){
var luogo_consegna_sede = new LuoghiConsegnaSede(req.body.sede[key].lcs[jey]);
// save luogo_consegna_sede and then push its _id
luogo_consegna_sede.save();
luoghi_consegna_sedi.push(luogo_consegna_sede._id);
}
sede.luoghi_consegna_sedi = luoghi_consegna_sedi;
// Save sede and then push its id
sede.save();
cliente.sedi.push(sede._id);
}
cliente.save(function(err){
if(err)
return res.sendStatus(400);
return res.json(cliente);
});
cliente.sedi是[Schema.ObjectId]。如果我对var cliente进行控制台日志,我会看到cliente.sedi不存在,而且在sede中也没有luoghi_consegna_sedi字段,而是有lcs(取自req.body)。为什么我不能设置luoghi_consegna_sedi和sedi田地?我猜错了。sedi是否有自己的模式和客户机。sedi对模式的引用?是的。sedi是一个objectid数组,引用sede(sedi的模式名)@pindol,您必须调用
cliente.markModified('sedi')
,否则mongoose不会推动更改。请看,问题1。@Tony说得好,mongoose不会为数组索引创建getter/setter。但是,@pindol尝试保存新文档,因此在这种情况下不需要markModified
。问题已更新。谢谢
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var LuoghiConsegnaSedeSchema = new Schema({
titolo_rif: String,
cognome: String,
nome: String,
tipo_sede_consegna: String,
sede_consegna: String,
telefono_1: String,
telefono_2: String,
cellulare_rif: String,
email_rif: String,
telefono_rif: String,
tipo_indirizzo_consegna: String,
indirizzo_consegna: String,
n_civico_consegna: String,
piano_consegna: String,
interno_consegna: String,
scala_consegna: String,
citofonare_consegna: String,
citta_consegna: String,
provincia_consegna: String,
regione_consegna: String,
cap_consegna: String,
paese_consegna: String,
eliminato: {
type: Boolean,
default: false
},
created: {
type: Date,
default: Date.now
}
});
LuoghiConsegnaSedeSchema.set('toJSON', {getters: true});
mongoose.model('LuoghiConsegnaSede', LuoghiConsegnaSedeSchema);
cliente.sedi = [];
for(var key in req.body.sede){
var sede = new Sede(req.body.sede[key]);
var luoghi_consegna_sedi = [];
for(jey in req.body.sede[key].lcs){
var luogo_consegna_sede = new LuoghiConsegnaSede(req.body.sede[key].lcs[jey]);
// save luogo_consegna_sede and then push its _id
luogo_consegna_sede.save();
luoghi_consegna_sedi.push(luogo_consegna_sede._id);
}
sede.luoghi_consegna_sedi = luoghi_consegna_sedi;
// Save sede and then push its id
sede.save();
cliente.sedi.push(sede._id);
}
cliente.save(function(err){
if(err)
return res.sendStatus(400);
return res.json(cliente);
});