मानगो में एक और स्कीमा का संदर्भ लेना


104

अगर मेरे पास दो स्कीमा हैं जैसे:

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});

var  User = mongoose.model('User') 

var postSchema = new Schema({
    name: String,
    postedBy: User,  //User Model Type
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

मैंने उन्हें ऊपर के उदाहरण की तरह एक साथ जोड़ने की कोशिश की लेकिन मैं यह नहीं कर पाया कि यह कैसे करना है। आखिरकार, अगर मैं ऐसा कुछ कर सकता हूं तो इससे मेरी जिंदगी बहुत आसान हो जाएगी

var profilePic = Post.postedBy.profilePic

जवाबों:


182

ऐसा लगता है कि पॉप्युलेट विधि वही है जो आपकी तलाश में है। पहले अपने पोस्ट स्कीमा में छोटे बदलाव करें:

var postSchema = new Schema({
    name: String,
    postedBy: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

फिर अपना मॉडल बनाएं:

var Post = mongoose.model('Post', postSchema);

फिर, जब आप अपनी क्वेरी बनाते हैं, तो आप इस तरह से संदर्भों को आबाद कर सकते हैं:

Post.findOne({_id: 123})
.populate('postedBy')
.exec(function(err, post) {
    // do stuff with post
});

4
के लिए "रेफरी" फ़ील्ड क्या है? मुझे इस पर प्रलेखन नहीं मिला।
के - एसओ में विषाक्तता बढ़ रही है।

3
@KarlMorrison रेफ फील्ड का अर्थ है कि जिस आईडी में उल्लेख किया गया है उसका संग्रह खोजा जाएगा।
अंकुर वर्मा

आबादी और AddToSet के बीच क्या अंतर होगा?
विन्नमुक्का

1
जहां के लिए संदर्भ है by:selectro
मुहम्मद उमर

1
@KarlMorrison "रेफ" के डॉक्स डॉक्स में दफन हैं populate: mongoosejs.com/docs/populate.html
जेफरी मार्टिनेज

19

परिशिष्ट: किसी ने भी "पॉप्युलेट" का उल्लेख नहीं किया है --- यह आपके समय और पैसे के लिए काफी है जो Mongooses पॉप्युलेट विधि को देख रहे हैं: इसके अलावा क्रॉस डॉक्युमेंट्स भी बताते हैं

http://mongoosejs.com/docs/populate.html


1

देर से जवाब, लेकिन यह जोड़ते हुए कि मानगो में भी सबडैक्जिशन की अवधारणा है

इस सिंटैक्स के साथ, आपको अपने userSchemaप्रकार के रूप में अपना संदर्भ देने में सक्षम होना चाहिए postSchema:

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});

var postSchema = new Schema({
    name: String,
    postedBy: userSchema,
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

postedByप्रकार के साथ अद्यतन फ़ील्ड पर ध्यान देंuserSchema

यह पोस्ट के भीतर उपयोगकर्ता ऑब्जेक्ट को एम्बेड करेगा, एक संदर्भ का उपयोग करके आवश्यक अतिरिक्त लुकअप को बचाएगा। कभी-कभी यह बेहतर हो सकता है, अन्य बार रिफ / पॉपुलेट मार्ग जाने का रास्ता हो सकता है। निर्भर करता है कि आपका आवेदन क्या कर रहा है।

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