如何在mongodb中对嵌入式数组进行排序

时间:2013-06-03 23:33:10

标签: mongodb mongoose

我有一个带有嵌入式注释的简单博客模式,它以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的使用有关,当文件得到更新时,回调会返回一个文件,在某些情况下返回带有完整文档的响应是昂贵的,我想要的是当我更新时,它没有& #39;给我一个回复。我看过mongodb,它说它是可能的,但是当谈到猫鼬时,我还没有看到任何关于在更新时没有返回文件的事情。

所以我回到了findOneAndUpdate上的mongoose doc,Model.findByIdAndUpdate(id,[update],[options],[callback]),[options]有一个select字段,允许我返回选中的字段/部分文件。 option = {select:' _id'},这样可行,但如果我想为了优化而不返回任何内容,请选择空白,例如option = {select:'&# 39;},这不起作用,并会给我一个完整的文档。

0 个答案:

没有答案