Мангуст назначает коллекцию другому

Я пытаюсь добавить сообщение в коллекцию пользователей после того, как пользователь был создан с пустыми сообщениями. Я пытался с populate без успеха .. любая помощь очень ценится.

// Post Model
const mongoose = require('mongoose');
const { Schema } = mongoose;
 
const UserModel = require('./user-model');
 
let PostSchema = new Schema({
  author: {
    ref: 'users',
    type: Schema.Types.ObjectId
  },
  content: String,
  description: String,
  date: {
    default: new Date(),
    type: Date
  },
  title: String,
  updatedAt: {
    default:  new Date(),
    type: Date
  }
});

let PostModel = mongoose.model('posts', PostSchema);
module.exports = PostModel;
// User Model 
 
const mongoose = require('mongoose');
const { Schema } = mongoose;
 
const PostModel = require('./post-model');
 
let UserSchema = new Schema({
  name: {
    type: String
  },
  email: {
    lowercase: true,
    type: String,
    trim: true,
    unique: true
  },
  password: {
    type: String,
  },
  postList: [{
    ref: 'posts',
    type: Schema.Types.ObjectId
  }],
});

const UserModel = mongoose.model('users', UserSchema);
module.exports = UserModel;

// save post controller
exports.savePost = (request, response, next) => {
  let { author, description, title } = request.body;
  let post = new PostModel({ author, description, title }).save();
  UserModel.findById(author)
    .then((user) => {
      user.postList.push(post);
      // Still Fails
      // How can i assign the post to the user ?
  });
}

Есть ли какой-либо способ сделать это другое, чем толкать или заполнять ?

3 ответа

  1. Для решения этой проблемы я предпочитаю использовать $push of mongo

    UserModel.findOneAndUpdate({
        _id: author.id,
       {
            $push: {
                    postList: post
                }
            }
    
    });
    
  2. Вы должны следовать этому процессу, чтобы сохранить успешно

    1. Сохранить сообщение, если успех, то
    2. Обновление пользователя для push postId в postlist

    можете попробовать это

    exports.savePost = (request, response, next) => {
      let post = new PostModel(request.body)
    
      post.save(function(err, data) {
        if(err) {
           //return error
        }
        // check by console your author is present or not
        // let author in your req.body
        let author = req.body.author
        UserModel.findOneAndUpdate({_id: author},{$push: {postList: post._id}},{new:true} function(error, user) {
            if(error) {
              // return error
            }
            console.log(user)
            // return success
        })
      });
    }
    
  3. exports.savePost = (request, response, next) => {
      let { user, description, title } = request.body;
    
      let post = new PostModel({ user, description, title });
    
      post.save()
        .catch((error) => {
          if (error) 
            throw new Error(error);
        })
        .then((post) => {
          UserModel.findOneAndUpdate({ _id: user }, {$push: { postList: post._id } })
          .populate('postList')
          .catch((error) => {
            if (error) 
              throw new Error(error);
          })
          .then((user) => {
            user.postList.forEach((item, postion) => {
              console.log(`${item} -at ${postion} \n`);
            });
          });
    
      });
    
    }

    Это то, что я сделал, и это сработало в конце концов. Я не знаю, если это правильное решение, но это работает.