我在尝试使用填充查询从数组中删除 objectid 时遇到了非常困难的事情。
这是我的架构
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 时,它会删除 book 模式项。
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()
中选择相关对象输出中的引用字段,则只需提供您想要或想要删除的字段列表在 .populate()
内调用:
users.findOne({'_id':userid})
.populate('books',"-_id")
.exec(function(usererr,userdata){
// userdata contains related without the _id field
});
因此 .populate()
中的第二个参数指定您要在后续查询中选择的字段。 -
符号表示“排除”该字段,否则您需要指定要具体包含的字段列表。
这是基本的 MongoDB 字段“投影”。这里的一条规则是您不能“混合”包含或排除两者。所以要么明确:
.populate('books','bookid imgURL forTrade')
或者只是排除“特殊”字段:
.populate('books', '-_id -__v')
其中 _id
是一般的“始终包含”主键,__v
是 mongoose 生成的版本键,您可能也不想在结果中使用它。
另见 Limit Fields to Return in a Query来自核心文档,以及 .select()
下的 mongoose 缩短语法.
关于node.js - 仅在 mongoose 中的填充数组中删除文档 objectid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35120859/