只有在mongoose的人口数组中删除文件objectid

我有一个非常困难的时候试图从一个数组中使用填充查询删除objectids。

这是我的模式

var userSchema = new Schema({ username: String, password: String, books: [{type: Schema.Types.ObjectId, ref: 'Book'}] } ); var bookSchema = new Schema({ bookid: {type:String, unique:true, required:true}, imgURL: String, fortrade: Boolean }); 

问题是与下面显示的查询。 当我只希望它删除books数组中的objectid时,它将删除该书籍模式项目。

 users.findOne({'_id':userid}).populate('books').exec(function(usererr,userdata){ if (usererr) return console.error(usererr); userdata.books.forEach(function(elm,idx){ if(elm.bookid==_book.bookid){ userdata.books[idx].remove(); } }) }); 

如果您只想从.populate()中的相关对象的输出中selectrefernced字段,则只需提供您想要的或要在.populate()调用中删除的字段的列表:

 users.findOne({'_id':userid}) .populate('books',"-_id") .exec(function(usererr,userdata){ // userdata contains related without the _id field }); 

因此, .populate()的第二个参数指定了您希望在后续查询中select的字段。 -符号表示“排除”该字段,否则你需要指定一个专门包含的字段列表。

这是基本的MongoDB领域的“投影”。 这里的一个规则是,你不能“混合”包括或排除。 所以要么是明确的:

 .populate('books','bookid imgURL forTrade') 

或者只是把“特殊”的领域:

 .populate('books', '-_id -__v') 

其中_id是通用的“始终包含”主键,而__v是mongoose生成的版本键,在结果中也可能不需要。

另请参阅核心文档中的限制在查询中返回的字段以及在.select()下的mongoose缩短语法。