2014-09-18 11 views
7

पर अद्वितीय सूचकांक मान लीजिए कि मैं एक साधारण स्कीमा करते हैं:नेवला subdocument

var testSchema = new mongoose.Schema({ 
    map: { type: [ mongoose.Schema.Types.Mixed ], default: [] }, 
    ...possibly something else 
}); 

अब यह सुनिश्चित करें कि जोड़े (_id, map._id) अद्वितीय हैं करते हैं।

testSchema.index({ _id: 1, 'map._id': 1 }, { unique: true }); 

db.test.getIndexes() का उपयोग कर त्वरित जांच से पता चलता है कि यह बनाया गया था।

{ 
    "v" : 1, 
    "unique" : true, 
    "key" : { 
     "_id" : 1, 
     "map._id" : 1 
    }, 
    "name" : "_id_1_map._id_1", 
    "ns" : "test.test", 
    "background" : true, 
    "safe" : null 
} 

समस्या यह है, यह सूचकांक नजरअंदाज कर दिया है और मैं आसानी से एक ही map._id के साथ कई सहायक दस्तावेज़ों बना सकते हैं। मैं आसानी से निम्न क्वेरी कई बार निष्पादित कर सकते हैं:

db.maps.update({ _id: ObjectId("some valid id") }, { $push: { map: { '_id': 'asd' } } }); 

और निम्नलिखित के साथ अंत:

{ 
    "_id": ObjectId("some valid id"), 
    "map": [ 
     { 
      "_id": "asd" 
     }, 
     { 
      "_id": "asd" 
     }, 
     { 
      "_id": "asd" 
     } 
    ] 
} 

क्या यहाँ हो रहा है? मैं विवादित उप-दस्तावेज़ क्यों धक्का दे सकता हूं?

+0

http://stackoverflow.com/questions/13907257/validating-uniqueness-of-an-embedded-document-scoped-by-its-parent-in-mongoose – JohnnyHK

+0

की संभावित डुप्ली कुछ अन्य चीज़ों का उपयोग करना बुरा अभ्यास है '_id' के लिए ऑब्जेक्ट आईडी से। आप ऐसा क्यों करना चाहते हो? –

उत्तर

14

लंबी कहानी कम: मोंगो सहायक दस्तावेज़ों के लिए अद्वितीय अनुक्रमणिका का समर्थन नहीं करता है, हालांकि यह उन्हें बनाने की अनुमति देता है ...

+4

... जिसका अर्थ है कि उप-दस्तावेजों के लिए अद्वितीय अनुक्रमण प्रश्न में समझाए गए तरीके से संभव नहीं है, और यही मैंने लिखा है। –

-3

पहला ऑब्जेक्ट लंबाई mongodb में लंबाई 24 होना चाहिए। फिर आप _id बंद कर सकते हैं, और आईडी या अन्य के रूप में _id का नाम बदल सकते हैं, और $addToSet आज़माएं। सौभाग्य।

CoffeeScript उदाहरण:

FromSchema = new Schema(
    source: { type: String, trim: true } 
    version: String 
    { _id: false }//to trun off _id 
) 

VisitorSchema = new Schema(
    id: { type: String, unique: true, trim: true } 
    uids: [ { type: Number, unique: true} ] 
    from: [ FromSchema ] 
) 

//to update 
Visitor.findOneAndUpdate(
    { id: idfa } 
    { $addToSet: { uids: uid, from: { source: source, version: version } } } 
    { upsert: true } 
    (err, visitor) -> 
    //do stuff 
+1

उप-दस्तावेज़ का '_id'' ऑब्जेक्ट आईडी 'नहीं है जब इसे' मिश्रित 'की सरणी के रूप में घोषित किया जाता है। इसके अलावा यह सवाल का जवाब नहीं देता है। –

11

यह गूगल में आया है, इसलिए मैंने सोचा कि मैं ' डी उप-दस्तावेजों में कार्यक्षमता जैसी अद्वितीय कुंजी बाधा प्राप्त करने के लिए एक इंडेक्स का उपयोग करने का विकल्प जोड़ें, आशा है कि यह ठीक है।

{ 
    _id: '...', 
    myArray: [{_id:'your schema here'}, {...}, ...] 
} 

कुंजी से किया जा रहा है कि आप अद्यतन सुनिश्चित एक नहीं लौटेगा:

var foo = { _id: 'some value' }; //Your new subdoc here 

db.yourCollection.update(
{ '_id': 'your query here', 'myArray._id': { '$ne': foo._id } }, 
{ '$push': { myArray: { foo } }) 

दस्तावेजों के साथ की तरह लग रही:

मैं नेवला साथ बहुत परिचित नहीं हूँ तो यह सिर्फ एक मोंगो कंसोल अद्यतन है यदि आपकी उप-दस्तावेज़ कुंजी पहले से मौजूद है तो अद्यतन करने के लिए दस्तावेज़ (यानी खोज भाग)।