javascript - Set mongo's _id with a custom UID -


background:

i have no control on post event coming db document called things. when post comes in, i've written function called findorcreate().(which either find or create record(object?) in things document). reduce redundancy, want use 3rd party post payload field nuid replace default _id of record(object).

question:

how can replace _id payloads field called nuid?

example payload:

curl -h "content-type: application/json" -x post -d '{"participant":{"nuid":"98asdf988sdf89sdf89989sdf9898"}}' http://localhost:9000/api/things 

schema

'use strict';  var mongoose = require('mongoose'),     schema = mongoose.schema;  var thingschema = new schema(   {nuid: string} );  module.exports = mongoose.model('thing', thingschema); 

thing.controller.js

//*currently function have both _id , nuid (which works not desirable) exports.findorcreate = function(req, res) {    var query = {"nuid": req.body.participant.nuid};   var update = {nuid: req.body.participant.nuid};    thing.findoneandupdate(       query,       update,       {upsert: true},       function(err, thing){         console.log(thing, "thing");         console.log(err, "err");         if(!thing) {           thing.create(req.body.participant, function(err, thing) {             if(err) { return handleerror(res, err); }           });         };         if(err){return handleerror(res, err); }       }   ); }); 

thing/index.js

var express = require('express'); var controller = require('./thing.controller');  var router = express.router();  router.get('/', controller.index); router.get('/:id', controller.show); router.post('/', controller.findorcreate); router.put('/:id', controller.update); router.patch('/:id', controller.update); router.delete('/:id', controller.destroy);  module.exports = router; 

i found reference still don't understand on how use given model happens before payload stack reference

you can set value of _id whatever want here , "upsert" well. it's matter of using $setoninsert in update statement:

var thingschema = new schema({   "_id": string },{ "_id": false });  var thing = mongoose.model('thing',thingschema);   thing.findbyidandupdate("98asdf988sdf89sdf89989sdf9898",   { "$setoninsert": { "_id": "98asdf988sdf89sdf89989sdf9898" } },   { "upsert": true },   function(err,doc) {     if (err) throw err;     console.log(doc);   } ) 

and creates new document if _id not exist or applies update ( in example nothing updated, matched , returned ) document matched.

if have other data want update use $set or other operators fields want alter other _id.


as alternate generating uuid client api ( or safety ) use node-uuid , plug generation schema:

var thingschema = new schema({   "_id": { "type": string, default: function genuuid() { uuid.v1() } } },{ "_id": false });  var thing = mongoose.model('thing',thingschema);   thing.findoneandupdate(   { "uname": "sam" },   { "$set": { "uname": "sam" } },   { "upsert": true },   function(err,doc) {     if (err) throw err;     console.log(doc);   } ) 

in way when _id not supplied operation created. trivial example here, makes point of setting default.


Comments

Popular posts from this blog

OpenCV OpenCL: Convert Mat to Bitmap in JNI Layer for Android -

android - org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope -

python - How to remove the Xframe Options header in django? -