我是NodeJs和MongoDB的新手,我想插入带有自动增量主键'id'的行。还在mongo服务器上定义了一个名为getNextSequence的函数。
这在Mongodb服务器上运行良好
> db.user.insert({
"id" : getNextSequence('user_id'),
"username" : "test",
"email" : "test@test.com",
"password" : "test123"
})
现在我想从NodeJs插入。我试过这个但是没有工作
db.collection('user').insertOne({
id : "getNextSequence('user_id')",
username : query.name,
email: query.email,
password: query.pass
}, function(err, result) {
assert.equal(err, null);
console.log("row insterted ");
callback();
});
答案 0 :(得分:6)
假设getNextSequence
是服务器脚本函数(即您通过db.system.js.save
定义和保存的方法),它不能在服务器外调用。一种方法是使用eval
,它强制服务器将字符串计算为js代码,即使这不是一个好习惯。这是一个例子:
db.eval('getNextSequence(\'user_id\')', function(err, result) {
db.collection('users').insert({
"id" : result,
"username" : "test",
"email" : "test@test.com",
"password" : "test123"
});
});
另一种方法是关注mongo tutorial并直接在NodeJS中实现getNextSequence
。语法几乎相同:
function getNextSequence(db, name, callback) {
db.collection("counters").findAndModify( { _id: name }, null, { $inc: { seq: 1 } }, function(err, result){
if(err) callback(err, result);
callback(err, result.value.seq);
} );
}
然后在nodeJS代码中使用它,如:
getNextSequence(db, "user_id", function(err, result){
if(!err){
db.collection('users').insert({
"_id": result,
// ...
});
}
});
注意:当然,您需要按照文档中的说明设置counters
集合。
答案 1 :(得分:1)
要完成此操作,我们将创建一个函数,该函数将继续尝试保存文档,直到使用_id增量保存该文档为止
async function retryUntilSave(db, task) {
try {
const index = await db.collection('tasks').find().count() + 1;
const result = await db.collection('tasks').insertOne(Object.assign(task, { _id: index }))
} catch (error) {
if (error.message.includes("_id_ dup key")) {
console.log("ID already exists!")
console.log("Retrying...");
retryUntilSave(db, task)
} else {
console.log(error.message);
}
}
}
我们可以使用task._id:index代替Object.assign()
最后,您可以通过发出一些并发请求来进行测试
for (let index = 0; index < 20; index++) {
setTimeout(async () => {
await retryUntilSave(db, { title: "Some Task" })
}, 1000);
}
如果同时提交两个或多个任务,此功能将很容易处理,因为当我们尝试插入重复的_id的文档时,mogod会引发错误,然后我们将再次尝试使用递增的_id再次保存文档,此过程将一直运行到我们成功保存了文档!
答案 2 :(得分:0)
你也可以使用&#34; mongodb-autoincrement&#34;节点js的模块。例如:
var autoIncrement = require("mongodb-autoincrement");
exports.yourMethod = function(newData, callback) {
autoIncrement.getNextSequence(db, your-collection-name, function (err, autoIndex) {
newData.id = autoIndex;
//save your code with this autogenerated id
});
}
答案 3 :(得分:0)
您还可以使用“ mongoose-auto-increment”。
代码只有4行
- var mongoose = require('mongoose');
- var autoIncrement = require('mongoose-auto-increment');
- autoIncrement.initialize(mongoose.connection);
- userSchema.plugin(autoIncrement.plugin,'user');
示例:
npm我猫鼬自动递增
connections.js:
const mongoose = require('mongoose');
require("dotenv").config;
const uri = process.env.MONGOURL;
mongoose.connect(uri, { useNewUrlParser: true }, (err) => {
if (!err) { console.log('MongoDB Connection Succeeded.') }
else { console.log('Error in DB connection : ' + err) }
});
require('../schema/userSchema');
userSchema.js:
var mongoose = require('mongoose'); // 1. require mongoose
var autoIncrement = require('mongoose-auto-increment'); // 2. require mongoose-auto-increment
var userSchema = new mongoose.Schema({
name: { type: String },
password: { type: String },
email: { type: String, unique: true, required: 'This field is required.' },
});
autoIncrement.initialize(mongoose.connection); // 3. initialize autoIncrement
userSchema.plugin(autoIncrement.plugin, 'user'); // 4. use autoIncrement
mongoose.model('user', userSchema);
答案 4 :(得分:0)
您可以在模型架构上使用以下程序包来自动增加您的收集字段。
SET sql_log_bin=OFF
在这里,我不关注如何连接MongoDB。我只关注如何将自动增量集成到模型/集合/表中。
mongoose-auto-increment //you can download it from npm