2016-12-05 129 views
1

我是新的NodeJs和MongoDB,我想插入行自動增量主鍵'ID'。還在mongo服務器上定義了一個名爲getNextSequence的函數。MongoDB和Nodejs插入ID自動增量

這是MongoDB的服務器上的工作完美

> db.user.insert({ 
    "id" : getNextSequence('user_id'), 
    "username" : "test", 
    "email" : "[email protected]", 
    "password" : "test123" 
}) 

現在我想從NodeJs.I插入已經試過,但沒有工作

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(); 
}); 
+1

爲什麼getNextSequence('user_id')是一個字符串? – Eric

+0

當我寫它作爲一個函數.. nodejs顯示錯誤,它沒有被定義爲一個函數....因爲我已經在mongodb服務器上定義此功能 – SDA

+0

我不知道如何通過它 – SDA

回答

4

假設getNextSequence是服務器腳本函數(即您通過db.system.js.save定義和保存的方法),它不能在服務器外調用。一種方法是使用eval,這會迫使服務器將字符串評估爲js代碼,儘管這不是一個好習慣。這裏有一個例子:

db.eval('getNextSequence(\'user_id\')', function(err, result) { 
    db.collection('users').insert({ 
     "id" : result, 
     "username" : "test", 
     "email" : "[email protected]", 
     "password" : "test123" 
    }); 
}); 

另一種方式是按照mongo tutorial,並直接實現getNextSequence中的NodeJS。語法是幾乎相同的:

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集合在解釋文檔。

+0

它插入NULL值? – SDA

+0

我更正了序列的id以匹配您的代碼。 – Derlin

+0

你的意思'結果'爲空? – Derlin