Sunday, 16 April 2017

Node Mongoose - saving embedded documents on API once receiving mongoId

I would like to know the best approach to solve the current scenario. I've got a node API which uses mongoose and bluebird. And some Android clients will post "movement" entities to it.

(Question at the end).

Let's say movement-model.js exports the Schema, and looks like this:

"use strict";

const mongoose = require('mongoose');

const _movementSchema = {
    movementId: { type: Number, requried: true },
    relMovementId: Number,
    _party: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'Party' }
}

module.exports = mongoose.Schema(_movementSchema, {collection: 'movement'});

And related exported Schema on party-model.js is as follows:

"use strict";

const mongoose = require('mongoose');

const _partySchema = {
    active: { type: Boolean, default: true },
    name: { type: String, trim: true, required: true },
    logo: { type: Buffer },
    coordenates: { lat: Number, long: Number },
    startOn: { type: Date, required: true },
    endOn: { type: Date, required: true }
}

module.exports = mongoose.Schema(_partySchema, {collection: 'party'});

Android client would send the JSON with ObjectId and not full populated object. So when the POST comes, I'm using it directly (i.e: let _movement = req.body;) and on the movement-dao.js I've got the createNew method and I'm exporting the Model:

"use strict";

const mongoose = require('mongoose');
const Promise = require('bluebird');
mongoose.Promise = Promise;
const movementSchema = require('../model/movement-model');

movementSchema.statics.createNew = (movement) => {
  return new Promise((resolve, reject) => {
    if (!_.isObject(movement)) {
      return reject(new TypeError('Movement is not a valid object.'));
    }

    let _something = new Movement(movement);

    _something.save((err, saved) => {
      err ? reject(err)
          : resolve(saved);
    });
  });
}

const Movement = mongoose.model('Movement', movementSchema);

module.exports = Movement;

What I want to accomplish is to: save the movement collection with the _party as the full party document is at the moment of the save, I mean an embedded document of a copy of the Party document, which will not be affected by the updates done to the Party document in the future.

While I cannot change the Android Client, so I will still be getting only the ObjectId from it.

JSON example of what Android client will post: {"movementId":1, "relMovementId":4138, "_party":"58dbfe26194cfc5a9ec9b7c5"}

I'm confused now, and not sure if due to the way Android is posting the JSON, I need two schemas; one for the object received (i.e: with ObjectId and ref to Party) and a second one for the object persisted (i.e: with the schema referenced _party: Party.Schema) or if I could do something simpler as some populate prior to save... or what.



via pehuen

No comments:

Post a Comment