2011-08-12 18 views
30

के बजाय आउटपुट 'आईडी' मैं mongoose (नोड) का उपयोग कर रहा हूं, _id के बजाय आईडी आउटपुट करने का सबसे अच्छा तरीका क्या है?मोंगोडीबी: '_id'

+1

नए पाठकों के लिए: नीचे आप एकाधिक * अलग * दृष्टिकोण देखेंगे। चुनिंदा या अधिक वोटों के लिए अंधेरे से जाने के बजाए, उन्हें चुनने से पहले सभी को पढ़ना बुद्धिमानी है। चीयर्स! – sshow

उत्तर

18

मैं अपने मॉडल पर एक toClient() विधि बनाता हूं जहां मैं ऐसा करता हूं।

Schema.method('toClient', function() { 
    var obj = this.toObject(); 

    //Rename fields 
    obj.id = obj._id; 
    delete obj._id; 

    return obj; 
}); 
+0

मैं वास्तव में मोंगोज़ के लिए नया हूं, ऐसा लगता है कि मैं क्या चाहता हूं। आप इसे क्लाइंट को कैसे कॉल करते हैं? आम तौर पर मैं करता हूं, ढूंढता हूं(), और दस्तावेज़ दस्तावेज़ वापस प्राप्त करता हूं, फिर बस res.send (दस्तावेज़) करें। तो इस मामले में, क्या मैं प्रत्येक दस्तावेज़ पर res.write (दस्तावेज़ [1] .toClient()) को कॉल करता हूं? धन्यवाद – Johnny

+0

यह मेरे लिए अब काम नहीं कर रहा है - क्या मोंगोस में ऐसा करने का तरीका बदल गया है? – outside2344

+3

आभासी शायद आप चाहते हैं। – Leonidas

0

अन्य ड्राइवर कि http://alexeypetrushin.github.com/mongo-lite सत्य पर convertId विकल्प सेट करता है नहीं है: यह भी नाम बदलने के लिए/अन्य विशेषताओं आप ग्राहक को भेजने के लिए नहीं करना चाहते हैं को दूर एक अच्छी जगह है। अधिक जानकारी के लिए "डिफ़ॉल्ट & सेटिंग" अनुभाग देखें।

59

यह देखते हुए कि आप मोंगोस का उपयोग कर रहे हैं, आप 'वर्चुअल' का उपयोग कर सकते हैं, जो अनिवार्य रूप से नकली फ़ील्ड हैं जो मोंगोस बनाता है। वे डीबी में संग्रहीत नहीं कर रहे हैं, वे सिर्फ रन टाइम पर पॉपुलेटेड हो:

// Duplicate the ID field. 
Schema.virtual('id').get(function(){ 
    return this._id.toHexString(); 
}); 

// Ensure virtual fields are serialised. 
Schema.set('toJSON', { 
    virtuals: true 
}); 

किसी भी समय toJSON आप इस स्कीमा से बनाने के मॉडल पर कहा जाता है, यह एक 'आईडी' फ़ील्ड कि _ id से मेल खाता है शामिल होंगे क्षेत्र मोंगो उत्पन्न करता है। इसी प्रकार आप उसी तरह से ऑब्जेक्ट के लिए व्यवहार सेट कर सकते हैं।

देखें:

आप एक BaseSchema में इस सार अपने सभी मॉडलों तो विस्तार/एक ही स्थान पर तर्क रखने के लिए आह्वान कर सकते हैं। मैंने एम्बर/नोड/मोंगोस ऐप बनाने के दौरान उपरोक्त लिखा था, क्योंकि एम्बर वास्तव में काम करने के लिए 'आईडी' फ़ील्ड रखना पसंद करता था।

+1

+1 मेरे लिए अच्छा काम किया –

+3

बहुत अच्छा समाधान (+1)। 'Console.log (obj)' का उपयोग करते समय मैं 'स्कीमा.सेट (' toObject ', {virtuals: true}) को आउटपुट में वर्चुअल देखने में सक्षम होने के लिए भी जोड़ूंगा। – Tom

+2

यह _id फ़ील्ड रखता है। मैं बदले में ट्रांसफॉर्म समाधान पसंद करता हूं, shakinfree द्वारा प्रदान किया गया एक मेरे लिए काम करता है। –

19
//Transform 
Schema.options.toJSON.transform = function (doc, ret, options) { 
    // remove the _id of every document before returning the result 
    ret.id = ret._id; 
    delete ret._id; 
    delete ret.__v; 
} 

वहाँ रिवर्स करने के लिए एक "Schema.options.toObject.transform" संपत्ति है या तुम सिर्फ एक आभासी आईडी के रूप में सेट कर सकते थे।

+0

इसके लिए धन्यवाद! –

15

यहां @ user3087827 द्वारा दिए गए उत्तर का एक वैकल्पिक संस्करण है। आप पाते हैं कि schema.options.toJSON अपरिभाषित है तो आप उपयोग कर सकते हैं:

schema.set('toJSON', { 
    transform: function (doc, ret, options) { 
     ret.id = ret._id; 
     delete ret._id; 
     delete ret.__v; 
    } 
}); 
12

नेवला v4.0 इस कार्यशीलता के हिस्सा बॉक्स से बाहर समर्थित है के रूप में। @Pascal Zajac द्वारा समझाया गया है कि मैन्युअल रूप से वर्चुअल id फ़ील्ड को मैन्युअल रूप से जोड़ने की आवश्यकता नहीं है।

नेवला अपने स्कीमा में से प्रत्येक प्रदान करती है जो एक स्ट्रिंग के लिए दस्तावेजों _ id क्षेत्र डाली लौटाता है, या मामले ObjectIds की , अपने hexString में डिफ़ॉल्ट द्वारा एक आईडी आभासी गेटर। यदि आप नहीं चाहते हैं कि आईडी स्टेटर आपकी स्कीमा में जोड़ा गया है, तो आप स्कीमा निर्माण समय पर इस विकल्प को पारित कर सकते हैं।Source

हालांकि, निर्यातJSON को इस क्षेत्र के लिए, यह अभी भी आवश्यक है आभासी क्षेत्रों में क्रमबद्धता सक्षम करने के लिए:

Schema.set('toJSON', { 
    virtuals: true 
}); 
+3

यह v4.0 से बहुत पहले सच था, लेकिन ओपी चाहता है कि * बस * आईडी (और _id नहीं) के लिए वापस लौटाया जाए। आभासी आईडी दोनों को शामिल करने के लिए बस मोंगोस को बताएं। – neverfox

3

मैं इस उद्देश्य के लिए plugin उपयोग करने के लिए एक आसान बनाया है कि मैं अपनी सभी परियोजनाओं और वैश्विक स्तर पर सभी स्कीमा के लिए आवेदन करता हूं। यह _id से id में परिवर्तित करता है और __v पैरामीटर भी स्ट्रिप्स करता है।

तो यह धर्मान्तरित: एक वैश्विक प्लगइन के रूप में

{ 
    "id": "400e8324a71d4410b9dc3980b5f8cdea", 
    "name": "Item A" 
} 

उपयोग::

{ 
    "_id": "400e8324a71d4410b9dc3980b5f8cdea", 
    "__v": 2, 
    "name": "Item A" 
} 
एक सरल और क्लीनर के लिए

const mongoose = require('mongoose'); 
mongoose.plugin(require('meanie-mongoose-to-json')); 

या एक विशिष्ट स्कीमा के लिए:

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 
const MySchema = new Schema({}); 
MySchema.plugin(require('meanie-mongoose-to-json')); 

उम्मीद है कि यह किसी की मदद करेगा।

schema.set('toJSON', { 
    virtuals: true, 
    versionKey:false, 
    transform: function (doc, ret) { delete ret._id } 
}); 

मुझे लगता है कि यह बहुत अच्छा है, तो वे अपने आप _ id को दबाने जब virtuals सच है होगा:

4

मैं इस का इस्तेमाल किया।

0

आइटम लौटने के लिए आप खोज करते समय कुल कार्य का भी उपयोग कर सकते हैं। $ प्रोजेक्ट आपको फ़ील्ड बनाने की अनुमति देगा, जो आप कर सकते हैं और इसे _id पर असाइन कर सकते हैं।

<model>.aggregate([{$project: {_id: 0, id: '$_id'}], (err, res) => { 
// 
}) 
संबंधित मुद्दे