是MEAN堆栈的新手,目前在添加(推送)&将元素更新为mongodb中的嵌套数组。我有一个如下所示的模型:
module.exports = mongoose.model('Check', {
appt_date: String,
details: [
{
appt_time: String,
detail: [ {
name : String,
doctor_name : String
}
]
}
]
});
通过Mongo Shell使用以下代码时,我可以根据模型创建文档。
db.check.insert({"appt_time":"10/10/16"});
db.check.update({"appt_time":"10/10/16"}, {$push: {"details": {"appt_time":"09:30 AM","detail":[]}}},{upsert:true});
db.check.update({"appt_time":"10/10/16","details.appt_time":"09:30 AM"}, {$push: {"details.$.detail": {"name":"roger","doctor":"timmy"}}},{upsert: true});
控制器如下:
var mongoose = require('mongoose');
var check = require('../../models/check');
module.exports.addAppointment = function (req, res){
console.log("time = " + req.body.appt_time);
console.log("date = " + req.body.appt_date);
var checker = new check ({ appt_date: req.body.appt_date });
checker.save();
check.update({"appt_date":req.body.appt_time}, {$push: {"details": {"appt_time":req.body.appt_time,"detail":[]}}},{upsert:true});
check.update({"appt_date":req.body.appt_date,"details.appt_time":"req.body.appt_time}, {$push: {"details.$.detail": {"name":"roger","doctor":"timmy"}}},{upsert: true});
res.json(res.body);
}
上述代码仅为" 25/01/1000"
添加了一个日期文件。"_id": ObjectId('57b49d6b9835c0cc26312e21'),
"appt_date": "25/01/2000",
"details": [],
"__v": 0
我需要的是 - 一个日期条目,多个时间条目以及相应的详细信息
{
"_id": ObjectId('57b4911cf9e57c0421d1efda'),
"appt_date": "10/10/2016",
"details": [
{
"appt_time": "09:30 AM",
"detail": [
{
"name": "roger",
"doctor": "timmy"
}
]
},
{
"appt_time": "10:30 AM",
"detail": [
{
"name": "david",
"doctor": "james"
}
]
}
]
}
我无法从此阵列执行推送或更新或读取操作。如果不解决这个问题,我无法进一步完成我的主项目。如果这不是实施模型/数据的正确方法,请提供建议。所以请帮我解决这个问题。如果问题不明确,我可以实时向您展示这些内容。
谢谢大家...... :)
答案 0 :(得分:0)
您是否尝试先将整个文档放在一起然后对其进行插入,而不是插入简单的文档然后进行更新以添加更多详细信息?例如,而不是这些行:
var checker = new check ({ appt_date: req.body.appt_date });
checker.save();
check.update({"appt_date":req.body.appt_time}, {$push: {"details": {"appt_time":req.body.appt_time,"detail":[]}}},{upsert:true});
check.update({"appt_date":req.body.appt_date,"details.appt_time":"req.body.appt_time}, {$push: {"details.$.detail": {"name":"roger","doctor":"timmy"}}},{upsert: true});
你可以这样做:
var draft_check = {
"appt_date" : req.body.appt_date,
"details" : [
{
"appt_time":req.body.appt_time,
"detail" : [
{
"name" : "roger",
"doctor":"timmy"
}
]
}
};
new check (draft_check).save();
这种方法可以使您的代码在客户端更清晰,并减少您需要进行的数据库访问次数。