ऑब्जेक्ट आईडी के एरियर के साथ मानगो स्कीमा कैसे बनाएं?


85

मैंने एक आम प्रयोक्ता स्कीमा परिभाषित किया है:

var userSchema = mongoose.Schema({
  email: { type: String, required: true, unique: true},
  password: { type: String, required: true},
  name: {
      first: { type: String, required: true, trim: true},
      last: { type: String, required: true, trim: true}
  },
  phone: Number,
  lists: [listSchema],
  friends: [mongoose.Types.ObjectId],
  accessToken: { type: String } // Used for Remember Me
});

var listSchema = new mongoose.Schema({
    name: String,
    description: String,
    contents: [contentSchema],
    created: {type: Date, default:Date.now}
});
var contentSchema = new mongoose.Schema({
    name: String,
    quantity: String,
    complete: Boolean
});

exports.User = mongoose.model('User', userSchema);

दोस्तों पैरामीटर को ऑब्जेक्ट आईडी की एक सरणी के रूप में परिभाषित किया गया है। तो दूसरे शब्दों में, एक उपयोगकर्ता के पास अन्य उपयोगकर्ताओं की आईडी युक्त एक सरणी होगी। मुझे यकीन नहीं है कि यह ऐसा करने के लिए उचित अंकन है।

मैं नए उपयोगकर्ता को वर्तमान उपयोगकर्ता के मित्र सरणी पर धकेलने का प्रयास कर रहा हूं:

user = req.user;
  console.log("adding friend to db");
  models.User.findOne({'email': req.params.email}, '_id', function(err, newFriend){
    models.User.findOne({'_id': user._id}, function(err, user){
      if (err) { return next(err); }
      user.friends.push(newFriend);
    });
  });

हालाँकि इससे मुझे निम्नलिखित त्रुटि मिलती है:

TypeError: ऑब्जेक्ट 531975a04179b4200064daf0 में कोई विधि 'कास्ट' नहीं है

जवाबों:


134

यदि आप Mongoose populate सुविधा का उपयोग करना चाहते हैं, तो आपको करना चाहिए:

var userSchema = mongoose.Schema({
  email: { type: String, required: true, unique: true},
  password: { type: String, required: true},
  name: {
      first: { type: String, required: true, trim: true},
      last: { type: String, required: true, trim: true}
  },
  phone: Number,
  lists: [listSchema],
  friends: [{ type : ObjectId, ref: 'User' }],
  accessToken: { type: String } // Used for Remember Me
});
exports.User = mongoose.model('User', userSchema);

इस तरह से आप इस क्वेरी को कर सकते हैं:

var User = schemas.User;
User
 .find()
 .populate('friends')
 .exec(...)

आप देखेंगे कि प्रत्येक उपयोगकर्ता के पास उपयोगकर्ताओं (इस उपयोगकर्ता के मित्र) की एक सरणी होगी।

और डालने का सही तरीका यह है कि गैबर ने कहा:

user.friends.push(newFriend._id);

1
लेकिन फिर यह एक सरणी बनाता है जैसे कि देखने के [{"$oid": "dfdfsdfsg565ls"},...]बजाय["hkugh87tgkgk", ....]
CodyBugstein

2
यह कैसे माना जाता है, ObjectIds की एक सूची है। मानगो पहले से ही उन्हें संभालता है।
रोड्रिगो रीस

populate()वास्तव में क्या करता है?
केनी वर्डेन

@KennyWorden से पॉप्युलेट विधि को पारंपरिक रिलेशनल डेटाबेस में शामिल होने के लिए अनुकरण करें। तो इस मामले में पॉपुलेट मित्र सरणी को उपयोगकर्ताओं के दस्तावेजों की एक सरणी से बदल देगा।
रोड्रिगो रीस

अरे, @RodrigoReis आप मुझे बता सकते हैं कि अगर मैं 'नाम -> पहले =' ajay 'करना चाहता हूं, तो प्रश्न कैसे लिख सकता हूं; `मैं मोटे तौर पर यह लिख रहा हूं लेकिन कोई परिणाम नहीं मिल रहा है।
अजय गुप्ता

22

मैं खुद मोंगोज़ के लिए नया हूं, इसलिए मुझे पूरा यकीन नहीं है कि यह सही है। हालाँकि, आप लिखते हैं:

friends: [mongoose.Types.ObjectId],

मेरा मानना ​​है कि आप जिस संपत्ति की तलाश कर रहे हैं वह वास्तव में यहां पाई गई है:

friends: [mongoose.Schema.Types.ObjectId],

यह हो सकता है कि आपने यह प्रश्न पोस्ट करने के बाद से डॉक्स बदल दिए हों। अगर ऐसा है तो माफी। कृपया अधिक जानकारी और उदाहरणों के लिए Mongoose SchemaTypes डॉक्स देखें ।


8

मैं यह कोशिश करूँगा।

user.friends.push(newFriend._id);

या

friends: [userSchema],

लेकिन मुझे यकीन नहीं है कि यह सही है।

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