Wie erstelle ich ein Mungo-Schema mit einem Array von Objekt-IDs?


82

Ich habe ein Mungo-Benutzerschema definiert:

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

Der Parameter friends ist als Array von Objekt-IDs definiert. Mit anderen Worten, ein Benutzer verfügt über ein Array, das die IDs anderer Benutzer enthält. Ich bin mir nicht sicher, ob dies die richtige Notation dafür ist.

Ich versuche, einen neuen Freund in das Freundesarray des aktuellen Benutzers zu verschieben:

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

Dies gibt mir jedoch den folgenden Fehler:

TypeError: Objekt 531975a04179b4200064daf0 hat keine Methode 'cast'

Antworten:


130

Wenn Sie die Mungo-Populationsfunktion verwenden möchten, sollten Sie Folgendes tun:

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

Auf diese Weise können Sie diese Abfrage durchführen:

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

Sie werden sehen, dass jeder Benutzer eine Reihe von Benutzern hat (die Freunde dieses Benutzers).

Und der richtige Weg zum Einfügen ist wie Gabor sagte:

user.friends.push(newFriend._id);

1
Aber dann erstellt es ein Array, das [{"$oid": "dfdfsdfsg565ls"},...]["hkugh87tgkgk", ....]
aussieht

2
So soll es sein, eine Liste von ObjectIds. Mungo behandeln sie bereits.
Rodrigo Reis

Was macht populate()genau?
Kenny Worden

@KennyWorden Die Populate-Methode von Mungo simuliert einen Join in traditionellen relationalen Datenbanken. In diesem Fall ersetzt das Auffüllen das Array "Freunde" durch ein Array von Benutzerdokumenten.
Rodrigo Reis

Hey, @RodrigoReis, kannst du mir sagen, wie ich eine Abfrage schreibe, wenn ich einen Namen haben möchte -> first = 'ajay'; `Ich schreibe das grob, bekomme aber kein Ergebnis.
Ajay Gupta

22

Ich bin selbst neu bei Mongoose, daher bin ich mir nicht ganz sicher, ob dies richtig ist. Sie scheinen jedoch geschrieben zu haben:

friends: [mongoose.Types.ObjectId],

Ich glaube, die Immobilie, die Sie suchen, befindet sich tatsächlich hier:

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

Es kann jedoch sein, dass sich die Dokumente geändert haben, seit Sie diese Frage gestellt haben. Entschuldigung, wenn das der Fall ist. Weitere Informationen und Beispiele finden Sie in den Mongoose SchemaTypes-Dokumenten .


8

Ich würde es versuchen.

user.friends.push(newFriend._id);

oder

friends: [userSchema],

aber ich bin nicht sicher, ob das richtig ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.