私はマングースでモデル化された、コメントが埋め込まれたブログの単純なスキーマを持っています
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);
}
})
}
最初の問題は、埋め込み配列の最初の 2 つのエントリを返すときです。スライスを使用すると、最初の 2 つのコメントが取得されますが、コメントを日付で並べ替える方法 {'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);
}
})
}
もう 1 つの質問は、findOneAndUpdate の使用に関するものです。ドキュメントが更新されると、コールバックはドキュメントを返します。場合によっては、完全なドキュメントで応答を返すのはコストがかかります。私に返事を。私はそれが可能であると言っているmongodbを見てきましたが、mongooseに関しては、更新時にドキュメントを返さないという話は見たことがありません。
そこで、findOneAndUpdate、 Model.findByIdAndUpdate(id, [update], [options], [callback]) で mongoose doc に戻りました。[options] には選択フィールドがあり、選択したフィールド/部分的なドキュメントを返すことができます。option = { select: '_id '}、これは問題なく動作しますが、最適化のために何も返したくない場合、たとえば option = { select: ''} のように select を空白のままにすると、これは機能せず、返されます私に完全なドキュメント。