2012-06-29 48 views
2

我正在使用Twitter身份驗證,並且想要將twitter ID作爲唯一鍵存儲在mongodb中。不過,我看到多個具有相同ID的條目。這裏是我的架構和代碼Node.js - 如何使用mongoose db創建一個唯一的ID

模式:

var TwitterSchema = new Schema({ 
    accessToken: String, 
    accessTokenSecret: String, 
    name: String, 
    twitterId: { type: String, required: true, index: { unique: true, sparse: true } } 
}); 

代碼:

 mongoose.connect('mongodb://localhost/twd') 
     mongoose.model('Post', TwitterSchema);  
     var Post = mongoose.model('Post'); 

     var post = new Post(); 
     post.accessToken = accessToken 
     post.accessTokenSecret = accessTokenSecret 
     post.name = twitterUserData.name 
     post.twitterId = twitterUserData.id 

     post.save(function(err){ 
      if (err){ 
       throw err; 
       promise.fail(err); 
      } 
      console.log('saved'); 
      mongoose.disconnect(); 
     }); 

     promise.fulfill(post); 

DB殼輸出

> db.posts.find(); 
{ "twitterId" : "21475255", "name" : "MMMK", "accessTokenSecret" : "ZYhiXMWfXvSr1aaCB93hgU243j8aapP0ALdSFlWEE", "accessToken" : "22475255-9YvKMceUInUIxcEtKAK0oMRRG2ZZxn5c52vnwPw", "_id" : ObjectId("4feddf6155203990e000001") } 
{ "twitterId" : "21475255", "name" : "MMMK, "accessTokenSecret" : "ZYhiXMWfXvSr1aaCB93hgU2438aapP0ALdSFlWEE", "accessToken" : "22475255-9YvKMceUInUIxcEtKAK0oMRRG2ZZxn5c52vnwPw", "_id" : ObjectId("4feddf7b5905a1a10e000001") } 
+0

您可以包括'db.posts.getIndexes()的輸出;'?這將確認預期的唯一指數是否確實存在。 – Stennie

回答

1

我的猜測是要麼不被MongoDB中創建索引,或者具有相同名稱的索引已經退出。如果它已經存在,貓鼬將使用ensureIndex來創建它,但是如果它已經存在,它不會覆蓋/重新定義它。使用mongo js shell查看它是否存在,然後嘗試刪除它,重新啓動mongod並再次運行node.js代碼。

http://www.mongodb.org/display/DOCS/Indexes#Indexes-CreationOptions

+0

我試過重新啓動mongodb,但沒有工作。不知道問題在哪裏。從db外殼添加輸出 – Vinoth

+0

你是否也嘗試過像'Peter'建議的'twitterId'上放置現有索引以確保它是按照您當前定義的方式創建的? – JohnnyHK

+0

如果集合中已有重複項,則不會創建新的唯一索引。您可以使用[dropDups:true](http://www.mongodb.org/display/DOCS/Indexes#Indexes-dropDups%3Atrue)修復此問題(極其謹慎:刪除重複或爲空的數據)。 – Stennie

相關問題