MongoDB和Nodejs使用自动增量插入ID

时间:2016-12-05 16:57:12

标签: node.js mongodb

我是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();
});

5 个答案:

答案 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行

     
      
  1. var mongoose = require('mongoose');
  2.   
  3. var autoIncrement = require('mongoose-auto-increment');
  4.   
  5. autoIncrement.initialize(mongoose.connection);
  6.   
  7. userSchema.plugin(autoIncrement.plugin,'user');
  8.   


示例:

  

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