【发布时间】:2018-02-15 16:33:28
【问题描述】:
我只是 node js 和 mongo db 的新手。我为事件采用了两种模型,一种用于事件数据,另一种用于事件包。所以事件的模型是这样的
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
const Schema = mongoose.Schema;
const bcrypt = require('bcrypt-nodejs');
const EventSchema = new Schema({
_id: mongoose.Schema.Types.ObjectId,
eventname: {
type: String,
required : true,
},
eventdesc: {
type: String,
required : true,
},
createdAt: {
type: Date,
default: Date.now
},
updatedAt: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('Event', EventSchema);
包的模型看起来像这样
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
const Schema = mongoose.Schema;
const bcrypt = require('bcrypt-nodejs');
const PackageSchema = new Schema({
_id: mongoose.Schema.Types.ObjectId,
eventpackages: {
type: Object,
required : false,
},
event: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Event'
},
createdAt: {
type: Date,
default: Date.now
},
updatedAt: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('Package', PackageSchema);
这是我的事件路由器文件,我从中获取事件的列表和详细信息
var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
const Event = require('../../model/event.model');
const Package = require('../../model/package.model');
/* GET ALL EVENTS */
router.get('/', function(req, res, next) {
Event.find(function (err, events) {
if (err) return next(err);
res.json(events);
});
});
/* GET SINGLE EVENT BY ID */
router.get('/:id', function(req, res, next) {
Event.findById(req.params.id, function (err, post) {
if (err) return next(err);
res.json(post);
});
// Package.find({'event': req.params.id}, function (err, post) {
// if (err) return next(err);
// res.json(post);
// });
});
/* SAVE EVENT */
router.post('/', function(req, res, next) {
let event = new Event ({
_id : new mongoose.Types.ObjectId(),
eventname : req.body.eventname,
eventdesc : req.body.eventdesc
});
event.save((err) => {
if(err) {
if( err.errors ) {
if( err.errors.eventname ) {
res.json({ success: false, message: err.errors.eventname.message });
}
else {
if( err.errors.eventdesc ) {
res.json({ success: false, message: err.errors.eventdesc.message });
}
}
}
else {
res.json({ success: false, message: 'Could not save Event. Error: ', err });
}
}
else {
let package = new Package({
_id: new mongoose.Types.ObjectId(),
event: event._id,
eventpackages : req.body.sections,
});
package.save(function(err) {
if (err) throw err;
res.json({ success: true, message: 'Event saved'});
});
}
});
});
/* UPDATE EVENT */
router.put('/:id', function(req, res, next) {
Event.findByIdAndUpdate(req.params.id, req.body, function (err, post) {
if (err) return next(err);
res.json(post);
});
});
/* DELETE EVENT */
router.delete('/:id', function(req, res, next) {
Event.findByIdAndRemove(req.params.id, req.body, function (err, post) {
if (err) return next(err);
res.json(post);
});
});
module.exports = router;
现在,当我为事件创建列表或详细信息页面时,我想获取事件的所有详细信息及其包,该包已在包模式中作为参考 ID。那么有人可以告诉我应该如何查询引用表,以便我一次获取所有数据并显示它们
【问题讨论】:
-
如果我理解错误,请纠正我,
event应该有一个package,但不是package和event。你应该指的是EventSchema里面的Package -
是的,一个事件应该有一个包。
-
Mongo $lookup。您可以使用此功能从两个不同的集合中获取数据。