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'

user2481095
quelle

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);
Rodrigo Reis
quelle
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 .

curzmg
quelle
8

Ich würde es versuchen.

user.friends.push(newFriend._id);

oder

friends: [userSchema],

aber ich bin nicht sicher, ob das richtig ist.

Gabor Laser Raz
quelle