Node.js 处理mongoose上的架构引用
我试图使用Node.js、mongoose和restify定义一个简单的RESTful API。目标是让用户能够对其他用户的配置文件进行评论。为此,我有一个评论端点,它接收文本、作者和评论的目标(其他用户) 我想引用用户,因此我定义了下一个架构: 用户架构:Node.js 处理mongoose上的架构引用,node.js,asynchronous,mongoose,foreign-keys,Node.js,Asynchronous,Mongoose,Foreign Keys,我试图使用Node.js、mongoose和restify定义一个简单的RESTful API。目标是让用户能够对其他用户的配置文件进行评论。为此,我有一个评论端点,它接收文本、作者和评论的目标(其他用户) 我想引用用户,因此我定义了下一个架构: 用户架构: var mongoose = require('mongoose'); var Schema = mongoose.Schema; var UserSchema = new Schema({ "username": { type: S
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
"username": { type: String, unique: true, required: true },
"password": { type: String, required: true },
"comments": [{ type: Schema.Types.ObjectId, ref: 'Comment' }]
});
mongoose.model('User', UserSchema);
注释模式:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var CommentSchema = new Schema({
date: { type: Date, default: Date.now },
text: { type: String, required: true },
author: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
target: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true }
});
mongoose.model('Comment', CommentSchema);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var User = mongoose.model('User');
var CommentSchema = new Schema({
date: { type: Date, default: Date.now },
text: { type: String, required: true },
author: { type: Schema.Types.ObjectId, ref: "User", required: true },
target: { type: Schema.Types.ObjectId, ref: "User", required: true }
});
CommentSchema.path('author').validate(function(value, respond) {
User.findOne({ _id: value}, function(err, user) {
respond(!err && user);
});
}, 'Author doesn\'t exists');
CommentSchema.path('target').validate(function(value, respond) {
User.findOne({ _id: value}, function(err, user) {
respond(!err && user);
});
}, 'Target user doesn\'t exists');
mongoose.model('Comment', CommentSchema);
我还有这个控制器(只显示createComment函数):
因此,我有三个问题:
- 为什么我需要检查收到的用户是否存在?我只想接收id并存储它,但我必须自己再做两次查询来检查它
- 我必须做什么才能将该用户作为目标存储在仅限用户的评论中在编辑的代码中求解
- 如何简化此代码?按顺序执行异步查询是一种痛苦。我希望有一般性的错误,而不是必须处理每一个
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var CommentSchema = new Schema({
date: { type: Date, default: Date.now },
text: { type: String, required: true },
author: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
target: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true }
});
mongoose.model('Comment', CommentSchema);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var User = mongoose.model('User');
var CommentSchema = new Schema({
date: { type: Date, default: Date.now },
text: { type: String, required: true },
author: { type: Schema.Types.ObjectId, ref: "User", required: true },
target: { type: Schema.Types.ObjectId, ref: "User", required: true }
});
CommentSchema.path('author').validate(function(value, respond) {
User.findOne({ _id: value}, function(err, user) {
respond(!err && user);
});
}, 'Author doesn\'t exists');
CommentSchema.path('target').validate(function(value, respond) {
User.findOne({ _id: value}, function(err, user) {
respond(!err && user);
});
}, 'Target user doesn\'t exists');
mongoose.model('Comment', CommentSchema);
控制器:
exports.createComment = function(req, res, next) {
var comment = new Comment(req.body);
comment.save(function(err, comment) {
if (err) {
res.status(500);
res.json({
type: false,
data: 'Error occurred: ' + err
});
} else {
User.findOne({ _id: comment.target }, function(err, user) {
user.comments.push(comment);
user.save();
});
res.json({
type: true,
data: comment
});
}
});
};
问题是,现在我必须在查询中使用_id(我想使用一个自定义id),每次我想保存一条注释时,我都要进行三次查询(两次用于验证,另一次用于存储注释)。有没有更好的办法
select
选项仅选择用户的_id字段,如下所示:
User.findOne({u-id:req.params.authorId})。选择({u-id:1})。执行(函数(err,User){})
target.comments.push(comment.\u id);
save(函数(err,targetAfterSaved){})