mongo和mongoose不同的行为?

在mongo shell中,我可以这样做:

db.getCollection('usercourses').update({ _id:ObjectId("54bee7c6ababf28b4ea5a07f")}, { $unset:{ 'steps.0.topic':'' } }, {strict:false}) 

它会从find的文档中删除数组内的对象的“主题”字段。

但是当我用mongoose做这个时:

 function() { return UserCourses.findQ() .then(function(uCourse){ return Q.all(uCourse.map(worker)) }).catch(function(error) { console.log(error); }); } function worker(uCourse) { return Q.all(uCourse.steps.map( function(step,i){ var field1 = 'steps.'+i+'.topic'; return UserCourses.updateQ({_id:uCourse._id}, { $unset:{field1:''}, }, {strict:false}); } )) } 

什么都没发生。

为什么?

因为你试图取消设置一个名为field1的字段(因为ES5没有计算属性名称 ):

 $unset : { field1 : '' } 

相反,你需要这样做:

 var obj = {}; obj['steps.'+i+'.topic'] = ''; ... $unset : obj