I'm having a really difficult time trying to remove the objectids from an array using a populated query.
this is my Schema
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
});
The problem is with the query shown below. it removes removes the book schema item when I only want it to remove the objectid in the books array.
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();
}
})
});
If all you want to do is select the refernced fields in the output of the related object from .populate()
, then simply supply the list of either the fields you want, or want to remove within the .populate()
call:
users.findOne({'_id':userid})
.populate('books',"-_id")
.exec(function(usererr,userdata){
// userdata contains related without the _id field
});
So the second parameter there in the .populate()
specifies the fields you want to select in the subsequent query. The -
notation means to "exclude" the field, otherwise you need to specify a list of fields to specifically include.
This is basic MongoDB field "projection". One rule here is that you cannot "mix" both include or exclude. So either be explicit:
.populate('books','bookid imgURL forTrade')
Or just exlcude the "special" fields:
.populate('books', '-_id -__v')
where _id
is the general "always included" primary key, and __v
is the mongoose generated version key, which you also might not want in results.
Also see Limit Fields to Return in a Query from the core documentation, as well as the mongoose shortened syntax for this under .select()
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With