Reputation: 329
How do I generate a unique ID for each entry into my mongoDB through Postman?
I run postman POST with http://localhost:8000/api/user/store
and send
{
"name":"testname",
"email":"[email protected]",
"phone":"testnumber",
"city":"testcity",
}
This gets saved in my mongoDB and shows this in my mongoDB compass
_id:61f7e48f0c651345677b7775
name:"testname"
email:"[email protected]"
phone:"testnumber"
city:"testcity"
__v:0
How can I generate a unique ID and add it in between this process such that it gets saved something like this:
_id:61f7e48f0c651345677b7775
uniqueID:68465135
name:"testname"
email:"[email protected]"
phone:"testnumber"
city:"testcity"
__v:0
My model userData.js looks like this:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const userSchema = new Schema({
name: {
type: String,
required: true
},
email: {
type: String,
required: true
},
phone: {
type: String,
required: true
},
city: {
type: String,
required: true
},
}, { timeStamps: true })
const User = mongoose.model('User', userSchema);
//export model to use in other files
module.exports = User;
This is the snippet from UserController.js
on how the data gets saved
// Saves user to the database
const store = (req, res, next) => {
let user = new User({
name: req.body.name,
email: req.body.email,
phone: req.body.phone,
city: req.body.city,
})
user.save()
.then(response => {
res.json({
message: 'User added successfully!'
})
})
.catch(error => {
res.json({
message: 'An error occured!'
})
})
}
The uniqueID can be anything I just added numeric as example. But it has to be unique. How can I do this? Any suggestions would be helpful.
Upvotes: 2
Views: 22089
Reputation: 779
You can use _id
from MongoDB as it will always be unique if you don't like the format of the MongoDB _id
you can change it to nanoid.
With new uniqueId
field
import { nanoid } from 'nanoid';
const UserSchema = new mongoose.Schema({
name: string,
uniqueId: {
type: String,
required: true,
default: () => nanoid(7),
index: { unique: true },
},
email: String,
phone: String,
city: String,
})
_id
with nanoid so it doesn't create an extra field in your schemaimport { nanoid } from 'nanoid';
const UserSchema = new mongoose.Schema({
_id: {
type: String,
default: () => nanoid(),
},
name: string,
email: String,
phone: String,
city: String,
})
// Saves user to the database
const store = async (req, res, next) => {
const { name, email, phone, city} = req.body;
try {
let user = new User({
name,
email,
phone,
city,
});
const savedUser = await user.save();
return res.json({
message: 'User added successfully!',
});
} catch (error) {
console.log(error)
return res.json({
message: 'An error occured!',
});
}
};
Upvotes: 8
Reputation: 41
As far as I know, _id
(ObjectId
) is already unique, and if you want to provide your own _id
you just need to set it in the entity.
Upvotes: 4
Reputation: 7578
The mongodb javascript driver has UUID
already:
db.foo.insert( {x: new UUID()} );
db.foo.aggregate([ {$project: {x:true, x_type: {$type: "$x"}}} ]);
{
"_id" : ObjectId("61f81af6a565bb368b38e345"),
"x" : UUID("b639a8b5-2598-429f-92e0-630c6b5bfbdc"),
"x_type" : "binData"
}
If you don't like the actual UUID
object then capture its string rep. Note that unfortunately, toString()
on the object does not yield 892ab869-3339-41b3-a612-5c29871f4e57
but rather the whole of UUID("892ab869-3339-41b3-a612-5c29871f4e57")
so you have to substr
it:
db.foo.insert( {x: (new UUID()).toString().substr(6,36) });
db.foo.aggregate([ {$project: {x:true, x_type: {$type: "$x"}}} ]);
{
"_id" : ObjectId("61f81b56a565bb368b38e348"),
"x" : "d5af9fb4-768c-4e17-b69a-8bcd80f8bf1e",
"x_type" : "string"
}
Or, for simplicity you can use the hex()
method:
db.foo.insert( {x: (new UUID()).hex() } );
db.foo.aggregate([ {$project: {x:true, x_type: {$type: "$x"}}} ]);
{
"_id" : ObjectId("61f81ba9a565bb368b38e34e"),
"x" : "b9810abea4344932b3da15f7f0d58e2c", // note the dashes went away
"x_type" : "string"
}
In all cases, the driver -- NOT the server -- will create a unique _id
if it is not supplied. Creation of a unique id that is not tied to the database (e.g. _id
) can be valuable when integrating and moving data around (compare with moving ROWID
out of Oracle in a CSV; not very useful). NOTE: The default generated type for _id
is ObjectId
which is a type in BSON and is not necessarily tied to MongoDB. That said, UUID is still more of a "machine/DB key" as compared to a familiar business key which can be made unique.
Upvotes: 1
Reputation: 485
You can't generate unique id technically but it has to be big enough to not generate the same id, example:
function create_UUID(){
var dt = new Date().getTime();
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = (dt + Math.random()*16)%16 | 0;
dt = Math.floor(dt/16);
return (c=='x' ? r :(r&0x3|0x8)).toString(16);
});
return uuid;
}
Output:
1fe35579-5ce7-46ec-89e0-7e7236700297
Source:
https://www.w3resource.com/javascript-exercises/javascript-math-exercise-23.php
Upvotes: 1