Невозможно вывести или вернуть массив отношений внутри объекта mon goose - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь изучить основные c отношения с MongoDB и mon goose, используя Node и Express.

Модель пользователя

let mongoose = require("mongoose");

userSchema = mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true
    }
});

userSchema.virtual("posts", {
    ref: "Post",
    localField: "_id",
    foreignField: "userId"
});

// Making sure that password field is not present in responses
userSchema.methods.toJSON = function() {
    let user = this.toObject();
    delete user.password;

    // console.log(user.posts);

    return user;
};

// Creating model from schema
User = mongoose.model("User", userSchema);

module.exports = User;

Почтовая модель

let mongoose = require("mongoose");

postSchema = mongoose.Schema({
    body: {
        type: String,
        required: true
    },
    userId: {
        type: mongoose.Schema.Types.ObjectId,
        required: true,
        ref: "User"
    }
});

let Post = mongoose.model("Post", postSchema);

module.exports = Post;

Это две модели, с которыми я работаю. У пользователей много сообщений.

Теперь я знаю, что могу получить одного пользователя по:

let user = await User.findOne();

И я могу заполнить отношение сообщений по:

await user.populate("posts").execPopulate();

Но когда я console.log(user) или res.send(user), я вижу только пользовательские данные, я не вижу данных о связях постов. Я могу console.log(user.posts) и получить данные таким образом. Но почему это не идет с самим объектом? Это поведение по умолчанию, и если это так, как мне получить пользовательский объект с массивом posts в моем ответе?

1 Ответ

1 голос
/ 03 марта 2020

Чтобы иметь возможность использовать виртуальное заполнение, вам нужно добавить в схему параметр toJSON: { virtuals: true }.

Так должно быть так:

userSchema = mongoose.Schema(
  {
    name: {
      type: String,
      required: true
    },
    email: {
      type: String,
      required: true,
      unique: true
    },
    password: {
      type: String,
      required: true
    }
  },
  {
    toJSON: { virtuals: true }
  }
);

Из документов :

Имейте в виду, что виртуальные объекты не включены в вывод JSON () по умолчанию. Если вы хотите, чтобы заполненные виртуалы отображались при использовании функций, основанных на JSON .stringify (), таких как Express 'res. json (), установите для параметра virtuals: true в вашей схеме значение JSON .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...