只有在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缩短语法。