उप-दस्तावेज़ सरणी आइटम के लिए _id संपत्ति बनाने से Mongoose को रोकें


227

यदि आपके पास उपनिर्देशन सरणियाँ हैं, तो Mongoose स्वचालित रूप से प्रत्येक के लिए आईडी बनाता है। उदाहरण:

{
    _id: "mainId"
    subDocArray: [
      {
        _id: "unwantedId",
        field: "value"
      },
      {
        _id: "unwantedId",
        field: "value"
      }
    ]
}

वहाँ एक सरणी के भीतर वस्तुओं के लिए आईडी नहीं बनाने के लिए Mongoose बताने के लिए एक रास्ता है?

जवाबों:


288

यह सरल है, आप इसे उपसमूह में परिभाषित कर सकते हैं:

var mongoose = require("mongoose");

var subSchema = mongoose.Schema({
    //your subschema content
},{ _id : false });

var schema = mongoose.Schema({
    // schema content
    subSchemaCollection : [subSchema]
});

var model = mongoose.model('tablename', schema);

2
क्या यह _idउपसमूह संग्रह में भी फ़ील्ड को छोड़ देगा , या केवल उस स्थिति में जहां उपसमूह का उपयोग उप-दस्तावेज़ आइटम की सरणी के रूप में एम्बेड करने के लिए किया जा रहा है? मैं विशेष रूप से SO पर अपने प्रश्न के कारण आज यह पूछता हूं ।
वेब यूजर

1
मैं नेस्टेड उप-स्कीमा संग्रह के दो स्तरों का उपयोग करता हूं। दूसरे शब्दों में, मेरे पास आपके उदाहरण के समान एक उपसमूह संग्रह है। उसके भीतर, मैं एक और अलग उप-स्कीमा संग्रह का उपयोग करता हूं। मैं केवल प्रथम स्तर के उप-स्कीमा मॉडल उदाहरणों का उपयोग करना चाहता हूं क्योंकि आईडी का उपयोग नहीं करना चाहिए, लेकिन दूसरे स्तर के (नेस्टेड) ​​उप-स्कीमा मॉडल उदाहरणों में आईडी होना आवश्यक है। जब मैं आपके समाधान का उपयोग करता हूं, अर्थात, { _id: false }उप-स्कीमा के दोनों स्तर आईडी के बिना होते हैं। इस व्यवहार के आसपास काम करने का कोई तरीका?
वेब यूजर

1
क्या आपने कोशिश की, तीसरे स्तर को सेट करने के लिए { _id : true }?
Throrin19

मैंने कल जो कोशिश की थी वह इसे बदल रहा था: let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });इस के लिए: let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });और उस _idनिर्माण को रोक दिया studentSchemaलेकिन उप-दस्तावेजों _idकी performanceसरणी में वस्तुओं पर बनाए रखा सृजन । यकीन है कि अगर दोनों नहीं _id: falseऔर id: falseकी जरूरत है।
वेब यूजर

धन्यवाद, मेरे लिए सबसे अच्छा तरीका है।
स्वेताजा हाजरा

128

आप स्कीमा के बिना उप-दस्तावेज बना सकते हैं और बच सकते हैं _id। बस _id:falseअपने subdocument घोषणा में जोड़ें ।

var schema = new mongoose.Schema({
   field1:{
      type:String
   },
   subdocArray:[{
      _id:false,
      field :{type:String}
   }]
});

यह _idआपके उपखंड में एक क्षेत्र के निर्माण को रोक देगा।

मानगो में परीक्षण किया गया v5.9.10


42

इसके अतिरिक्त, यदि आप एक उप-स्कीमा को निर्दिष्ट करने के लिए एक वस्तु शाब्दिक वाक्यविन्यास का उपयोग करते हैं, तो आप _id: falseइसे केवल दबाने के लिए भी जोड़ सकते हैं ।

{
   sub: {
      property1: String,
      property2: String,
      _id: false
   }
}

26

मैं mongoose 4.6.3 का उपयोग कर रहा हूं और मुझे जो कुछ भी करना था वह _id जोड़ रहा था: स्कीमा में झूठा, उप-विषय बनाने की आवश्यकता नहीं।

{
    _id: ObjectId
    subDocArray: [
      {
        _id: false,
        field: "String"
      }
    ]
}

पूरे संग्रह में अद्वितीय बनाने का एक तरीका है?
सैतामा

शायद इस पद्धति के साथ नहीं, लेकिन आप हमेशा कोशिश कर सकते हैं। _idएक बाधा के बजाय एक क्षेत्र है।
जेमिलोइ

अगर उस उप-दस्तावेज़ के निर्माण के दौरान, मैं स्पष्ट रूप से _id = mongoose.Types.ObjectId()बताऊंगा, तो क्या यह संग्रह भर में अद्वितीय होगा?
सैतामा

बस एक नया स्टैक ओवरफ्लो खोलें, इस तरह से आप कई लोगों को एक ही बार में जवाब देने के लिए मिल सकते हैं ~
jemiloii

4

आप दोनों में से किसी एक का उपयोग कर सकते हैं

var subSchema = mongoose.Schema({
//subschema fields    

},{ _id : false });

या

var subSchema = mongoose.Schema({
//subschema content
_id : false    

});

दूसरे विकल्प का उपयोग करने से पहले अपने मानस संस्करण की जाँच करें


1

यदि आप एक पूर्वनिर्धारित स्कीमा (_id के साथ) को उप-साध्य (बिना _id) के रूप में उपयोग करना चाहते हैं, तो आप सिद्धांत रूप में अनुसरण कर सकते हैं:

const sourceSchema = mongoose.Schema({
    key : value
})
const subSourceSchema = sourceSchema.clone().set('_id',false);

लेकिन यह मेरे लिए काम नहीं किया। तो मैंने कहा कि:

delete subSourceSchema.paths._id;

अब मैं _id के बिना अपने मूल दस्तावेज़ में सबस्रोसकेम को शामिल कर सकता हूं। मुझे यकीन नहीं है कि यह ऐसा करने का सबसे अच्छा तरीका है, लेकिन यह काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.