Как лучше всего прикрепить свойства к документам mon goose - PullRequest
1 голос
/ 29 марта 2020

У меня есть массив сообщений, и каждое сообщение содержит идентификатор автора. Я хочу l oop просмотреть каждое сообщение и найти автора из модели пользователя, используя идентификатор автора, а затем прикрепить его к сообщению. Какой самый лучший и эффективный способ сделать это. В настоящее время я делаю это таким образом, но это снижает производительность. Спасибо.

  posts = await Promise.all(
    posts.map(async post => {
      post.author = await User.findById(post.author).lean();
      return post;
    })
  );


  // POST SCHEMA

  const postSchema = new mongoose.Schema({
   author: {
     type: String,
     required: true
   },
   body: {
     type: String,
     required: true
   },
   post_image: {
     url: String,
     public_id: String,
     width: Number,
     height: Number
   },
  date_created: {
    type: Date,
    default: Date.now()
  }
 });


 // USER SCHEMA


 const userSchema = new mongoose.Schema({
  name: {
   type: String,
   required: true
  },
  email: {
   type: String,
   required: true,
   unique: true
  },
  password: {
   type: String,
   required: true
  },
  register_date: {
    type: Date,
    required: true,
    default: Date.now()
  },
  friends: {
    type: Array,
    default: []
  }
 });

1 Ответ

0 голосов
/ 29 марта 2020
  // NEW POST SCHEMA

  const postSchema = new mongoose.Schema({
   author: {
     type: mongoose.Schema.Types.ObjectId,
     ref: 'users',
     required: true
   },
   body: {
     type: String,
     required: true
   },
   post_image: {
     url: String,
     public_id: String,
     width: Number,
     height: Number
   },
  date_created: {
    type: Date,
    default: Date.now()
  }
 });


 // USER SCHEMA


 const userSchema = new mongoose.Schema({
  name: {
   type: String,
   required: true
  },
  email: {
   type: String,
   required: true,
   unique: true
  },
  password: {
   type: String,
   required: true
  },
  register_date: {
    type: Date,
    required: true,
    default: Date.now()
  },
  friends: [{
     type: mongoose.Schema.Types.ObjectId,
     ref: 'users',
     required: true
  }],
 });

Вы можете использовать автоматическое заполнение объекта mon go в mon goose. Это не вызовет проблем с производительностью, так как использует идентификатор индекса. Похоже на это: c: https://mongoosejs.com/docs/populate.html

Ваш запрос будет выглядеть следующим образом:

const post = await Post.find({ author: { $in: req.user.friends }})
                       .populate('author')
                       .exec();
console.log(post);

Или вы можете использовать агрегат в соответствии с этим документом: https://mongoosejs.com/docs/api/aggregate.html

Ваш запрос будет выглядеть следующим образом:

const query = [
      { $match: { author: { $in: req.user.friends } } },
      { $lookup: { from: "users", localField: "author", foreignField: "_id", as: "authorDetails" } },
      { $unwind: "authorDetails" },
]
const post = await Post.aggregate(query).exec();
console.log(post);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...