我有一个带有嵌入式注释的简单博客模式,它以mongoose为模型
var BlogSchema = mongoose.Schema({
...............,
comments:[Comment],
visits:int
});
var Comment = mongoose.Schema({
name : { type: String }
, img : { type:String }
, date : { type: Date, default: Date.now }
, text : String
});
var BlogModel = mongoose.model('Blog',BlogSchema);
function findCommentsById(id,option,callback){
var id;
try {
id = mongoose.Types.ObjectId(id);
} catch(e) {
return callback(e, null);
}
BlogModel.findById(id,{'comments':{ $slice: [ option.skip ,option.limit] }},{'sort':{'comments.date':1}},function(err, comm) {
if(err){callback(err, null);}
else{
console.log("findCourseCommentsById".red,comm);
callback(null, comm);
}
})
}
第一个问题是当我返回嵌入式数组的前两个条目时,使用slice可以检索前两个注释,但是如何按日期排序注释,{'sort':{'comments.date':1似乎不起作用 . 它还给我一个完整的文件,但实际上我真正需要的只是回复我的评论
function addComment(bid,name,img,text,callback){
var options = { new: false, select: 'comments' };
BlogModel.findOneAndUpdate({'_id':bid},{'$push':{'comments':{'name':name,'img':img,'text':text}},'$inc':{'visits':1}},options,function(err,ref){
if(err) {
console.log('add addComment'.red,err);
callback(err, null);
}else{
console.log('add addComment '.green+ref);
callback(null,ref);
}
})
}
另一个问题与findOneAndUpdate的使用有关,当文件得到更新时,回调会返回一个文件,在某些情况下返回带有完整文档的响应是昂贵的,我想要的是当我更新时,它没有给出我的回应 . 我见过mongodb,它说它是可能的,但是当涉及到猫鼬时,我还没有看到任何关于更新时不返回文档的内容 .
所以我在findOneAndUpdate,Model.findByIdAndUpdate(id,[update],[options],[callback])上回到了mongoose doc,[options]有一个select字段,允许我返回所选字段/部分文档 . option = {select:'id '},这样可行,但是如果我想为了优化而不返回任何内容,请选择空白,例如option = {select:' '}, this doesn' t work并将返回一个完整的doc .