2011-05-20 14 views
15

मैं node.js. के लिए MongoDB आवरण के रूप में नेवला का उपयोग कर पिछले डाला _id प्राप्त करना चाहते हैं, मैं निम्नलिखित ट्यूटोरियल मिल गया है, लेकिन क्योंकि एप्लिकेशन एक सार्वजनिक सर्वर पर चलाता है मैं किसी भी नोड मॉड्यूल में परिवर्तन नहीं कर सकते हैं:नोड + मोंगोस: आखिरी डाली गई आईडी प्राप्त करें?

Getting "Last Inserted ID" (hint - you have to hack Mongoose)

कोई अन्य विचार? यह मुझे क्या करना चाहते हैं:

  • नया सम्मिलित उपयोगकर्ता
  • प्राप्त उपयोगकर्ता के _id मूल्य
  • उपयोगकर्ता की आईडी के आधार पर एक नया सत्र सेट
  • रीडायरेक्ट/करने के लिए

धन्यवाद!

उत्तर

33

मैं mongoose संस्करण 1.2.0 का उपयोग कर रहा हूं और जैसे ही मैंने एक मोंगोज़ मॉडल का एक नया उदाहरण बनाया है, _id पहले से सेट है।

coffee> u = new User() 
[object Object] 
coffee> u._id 
4dd68fc449aaedd177000001 

मैं भी पुष्टि की कि बाद मैं u.save() फोन _id ही रहता है। मैंने मोंगोहब के माध्यम से सत्यापित किया कि वास्तव में यह वास्तविक आईडी मोंगोडीबी में सहेजी गई है।

+0

सुनने के लिए अच्छा!परीक्षण के लिए धन्यवाद! – Tronic

0

मोंगोडीबी के साथ, यदि आप स्पष्ट रूप से दस्तावेज़ का _id मान सेट नहीं करते हैं तो क्लाइंट ड्राइवर स्वचालित रूप से इसे ObjectId मान पर सेट कर देगा। इस डेटाबेस सर्वर पर आईडी जेनरेट और एक अन्य क्वेरी की जरूरत है इसे पुनः प्राप्त करने, के साथ की तरह हो सकता है से अलग है एसक्यूएल सर्वर के scope_identity() या MySQL के last_insert_id()

यह आपको डेटा डालने के लिए एसिंक्रोनस रूप क्योंकि आगे बढ़ने से पहले सर्वर में कोई _id मान देने के लिए के लिए प्रतीक्षा करने की जरूरत नहीं है की अनुमति देता है।

तो, पता चला के रूप में पीटर का जवाब है, _id उपलब्ध करने से पहले दस्तावेज़ डेटाबेस से सहेजा जाता है।

3

यदि आप उप ऑब्जेक्ट के अंतिम डाले गए _id को प्राप्त करने के लिए देख रहे हैं, तो ऑब्जेक्ट बनाएं, और इसे आइटम में जोड़ें। यहाँ ग्राहक को वापस भेजने के लिए MongoDB और नेवला (कुछ स्कीमा चीनी जोड़ने के लिए) जो तब JSON के परिणाम धर्मान्तरित का उपयोग कर NowJS में एक उदाहरण है:

   var nowRoomID = this.now.room; 
       var Conversation = mongoose.model('Conversation'); 
       Conversation.findById(convID, function(error, conversation) { 
        var Blip = mongoose.model('Blip'); 
        var createdBlip = new Blip(); 
        createdBlip.author= nowUserName; 
        createdBlip.authorid = parsed.authorid; 
        createdBlip.body = revisedText; 
        createdBlip.created_at = new Date(); 
        createdBlip.modified_at = new Date(); 

        conversation.blips.push(createdBlip); 
        parsed._id = createdBlip._id; //NOTE: ID ACCESSED HERE 
        message = JSON.stringify(parsed); 

        conversation.save(function (err) { 
         if (!err) { 
          console.log('Success - saved a blip onto a conversation!'); 
          nowjs.getGroup(nowRoomID).now.receiveMessage(nowUserName, message); 
         } 

        }); 
0

मैं सिर्फ दस्तावेज़ कॉलबैक के लिए पारित से आईडी मिलता है, चूंकि सेव किया गया सहेजा गया दस्तावेज़ सहेजता है।

5

आप स्पष्ट रूप से अपने मॉडल के लिए की घोषणा तो

_id: Schema.ObjectId 

, तो ObjectId नहीं के बाद उपलब्ध नई है या बचत होगी। यह शायद एक बग है। दिए गए यूआरएल में कोड निम्नलिखित यूआरएल

http://mongodb.github.io/node-mongodb-native/markdown-docs/insert.html

नीचे

+1

मैं इस बग की पुष्टि करता हूं। – Olivier

-2

चेक आप पाएंगे

var document = {name:"David", title:"About MongoDB"}; 
    collection.insert(document, {w: 1}, function(err, records){ 
    console.log("Record added as "+records[0]._id); 
}); 
+1

यह ** mongoose ** समाधान नहीं है – ruX