2 votes

La requête Mongoose n'affiche pas le sous-document

Je n'arrive pas à faire en sorte que mongoose affiche le sous-document lors de l'exécution de find() alors qu'il s'affiche parfaitement bien dans le shell mongodb.

Le sous-document doit être intégré sur la base de mon schéma, et non référencé par l'ID objet, donc je ne devrais pas avoir à faire de la magie noire pour que mes données s'affichent.

const UserSchema = new mongoose.Schema({
  username: String;
  xp: Number;
  //etc.
});

const RoomSchema = new mongoose.Schema({
  timestamp: { type: Date, default: Date.now },
  status: { type: String, enum: ["pending", "ongoing", "completed"]},
  players: {
    type: [{
      points: { type: Number, default: 0 },
      position: String,
      user: UserSchema
    }],
    maxlength:2
  }
});

Après avoir ajouté une nouvelle pièce avec :

let room = new Room(coreObj);
room.players.push({
  points: 0,
  position: 'blue',
  user: userObj //where userObj is a result of running findById on User model
});

Il s'affiche bien dans le shell mongo, en exécutant db.rooms.find({}).pretty() je peux voir que le document complet a été ajouté. Cependant, lors de l'exécution sur le modèle mongoose :

Room.find({}).exec((err,rooms)=>{
  console.log(rooms[0].toJSON()); 
});

Je ne vois pas le sous-document utilisateur, de plus je ne peux pas voir le champ utilisateur entièrement ! Quel semble être le problème ?

json enregistré à partir du modèle Mongoose :

{
    "status": "pending",
    "_id": "5cf5a25c050db208641a2076",
    "timestamp": "2019-06-03T22:42:36.946Z",
    "players": [
        {
            "points": 0,
            "_id": "5cf5a25c050db208641a2077",
            "position": "blue"
        }
    ],
    "__v": 0
}

json à partir du shell mongo :

{
        "_id" : ObjectId("5cf5a25c050db208641a2076"),
        "status" : "pending",
        "timestamp" : ISODate("2019-06-03T22:42:36.946Z"),
        "players" : [
                {
                        "points" : 0,
                        "_id" : ObjectId("5cf5a25c050db208641a2077"),
                        "position" : "blue",
                        "user" : {
                                "xp" : 0,
                                "_id" : ObjectId("5cf2da91a45db837b8061270"),
                                "username" : "bogdan_zvonko",
                                "__v" : 0
                        }
                }
        ],
        "__v" : 0
}

1voto

developing2020 Points 292

En gardant à l'esprit la meilleure pratique, je pense qu'il serait plus approprié de faire référence à la UserSchema dans le RoomSchema . Quelque chose comme :

...
user: {
   type: Schema.Types.ObjectId,
   ref: 'UserSchema'
}

Ensuite, vous stockez le user._id dans ce domaine.

De cette façon, si l'utilisateur est modifié, votre RoomSchema fait toujours référence à l'information correcte. Vous pouvez alors obtenir l'utilisateur en utilisant la fonction de Mongoose populate

0voto

Kevin Adistambha Points 3886

Je ne sais pas exactement pourquoi vous ne pouvez pas voir le sous-sous-document, mais cet exemple de code l'a imprimé correctement pour moi. L'exemple a été posté à l'origine dans https://mongoosejs.com/docs/subdocs.html mais légèrement modifié pour contenir le sous-sous-document afin qu'il ressemble à votre code :

var grandChildSchema = new mongoose.Schema({ name: 'string' });

var childSchema = new mongoose.Schema({ name: 'string', grandChild: grandChildSchema });

var parentSchema = new mongoose.Schema({ children: [childSchema] });

var Parent = mongoose.model('Parent', parentSchema);

var parent = new Parent({
  children: [
    { name: 'Matt', grandChild: {name: 'Matt Jr'} },
    { name: 'Sarah', grandChild: {name: 'Sarah Jr'} }
  ]
})

parent.save(function() {
  Parent.find().exec(function(err, res) {
    console.log(JSON.stringify(res[0]))
    mongoose.connection.close()
  })
});

En exécutant ce code, on obtient :

{
  "_id": "5cf7096408b1f54151ef907c",
  "children": [
    {
      "_id": "5cf7096408b1f54151ef907f",
      "name": "Matt",
      "grandChild": {
        "_id": "5cf7096408b1f54151ef9080",
        "name": "Matt Jr"
      }
    },
    {
      "_id": "5cf7096408b1f54151ef907d",
      "name": "Sarah",
      "grandChild": {
        "_id": "5cf7096408b1f54151ef907e",
        "name": "Sarah Jr"
      }
    }
  ],
  "__v": 0
}

Ceci a été testé en utilisant Mongoose 5.5.12.

Notez que j'utilisais JSON.stringify() pour imprimer le document au lieu d'utiliser l'outil d'impression de Mongoose toJSON() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X