Nesne Kimlikleri Dizisi ile Mongoose Şeması Nasıl Oluşturulur?


85

Bir firavun faresi kullanıcı şeması tanımladım:

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);

friends parametresi, Nesne Kimlikleri dizisi olarak tanımlanır. Diğer bir deyişle, bir kullanıcı, diğer kullanıcıların kimliklerini içeren bir diziye sahip olacaktır. Bunun bunu yapmak için doğru gösterim olup olmadığından emin değilim.

Mevcut kullanıcının arkadaş dizisine yeni bir Arkadaş göndermeye çalışıyorum:

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);
    });
  });

ancak bu bana şu hatayı veriyor:

TypeError: Object 531975a04179b4200064daf0 'cast' yöntemine sahip değil

Yanıtlar:


135

Mongoose populate özelliğini kullanmak istiyorsanız şunları yapmalısınız:

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);

Bu şekilde şu sorguyu yapabilirsiniz:

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

Her Kullanıcının bir dizi Kullanıcıya (bu kullanıcının arkadaşları) sahip olacağını göreceksiniz.

Ve yerleştirmenin doğru yolu Gabor'un dediği gibidir:

user.friends.push(newFriend._id);

1
Ama sonra [{"$oid": "dfdfsdfsg565ls"},...]yerine benzeyen bir dizi oluşturur["hkugh87tgkgk", ....]
CodyBugstein

2
Böyle olması gerekiyordu, bir ObjectIds listesi. Firavun faresi onları zaten halletti.
Rodrigo Reis

populate()Tam olarak ne yapar ?
Kenny Worden

@KennyWorden, firavun faresinden populate yöntemi geleneksel ilişkisel veritabanlarında bir birleşimi simüle eder. Bu durumda, doldurma, friends dizisini bir dizi Users belgesiyle değiştirecektir.
Rodrigo Reis

Hey, @RodrigoReis bana `isim -> ilk = 'ajay' istiyorsam nasıl sorgu yazacağımı söyleyebilir misin? Bunu kabaca yazıyorum ama sonuç alamıyorum.
Ajay Gupta

23

Ben de Mongoose'da yeniyim, bu yüzden bunun doğru olduğundan tam olarak emin değilim. Ancak, yazmış görünüyorsunuz:

friends: [mongoose.Types.ObjectId],

Aradığınız mülkün aslında burada bulunduğuna inanıyorum:

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

Yine de bu soruyu gönderdiğinizden beri dokümanlar değişmiş olabilir. Durum buysa özür dilerim. Daha fazla bilgi ve örnekler için lütfen Mongoose SchemaTypes belgelerine bakın.


8

Bunu denerdim.

user.friends.push(newFriend._id);

veya

friends: [userSchema],

ama bunun doğru olup olmadığından emin değilim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.