javascript - Understanding upsert with $push -
i have region collection:
var regionschema = new mongoose.schema({ name: {type: string}, registrations: [{type: mongoose.schema.types.objectid, ref: 'registrations'}], ... }); a registration collection:
var registrationschema = mongoose.schema({ firstname: {type: string}, ... }); in controller instantiate registration save region upsert option set true:
var registration = new registration(req.body.registration); ... region .update( { _id: user.region}, { $push: {registrations: registration}, { upsert: true } ) .exec(); what find objectid("...") does, in fact, pushed onto registrations property of region, e.g.:
{ name: "northwest", registrations: [objectid("57d038a1466345d52920b194")] } but there no matching document _id in registrations collection. question: not understanding nature of upsert flag; not suggest calling save on registration unnecessary?
the upsert flag applies collection you're operating on; in case, region collection. so, when calling region.update, create object _id of user.region if object id doesn't exist.
mongo doesn't enforce strict id references, let push id onto registrations long id valid.
you'll need save registration object first:
var registration = new registration(req.body.registration); registration.save(function() { region.update( { _id: user.region}, { $push: {registrations: registration}, { upsert: true } ) .exec(); });
Comments
Post a Comment