【问题标题】:How to Append key: value pairs to existing Mongodb objects using Mongoose如何使用 Mongoose 将键:值对添加到现有的 Mongodb 对象
【发布时间】:2021-03-24 19:34:41
【问题描述】:

const express = require('express');
const bcrypt = require('bcryptjs');
const passport = require('passport');
const { ensureAuthenticated } = require('../config/auth');

const router = express.Router();

//User/Post model
const User = require('../models/DBmusevista');

//Welcome/register page
router.get('/', (req, res) => res.render('register'));

//Login page
router.get('/login', (req, res) => res.render('login'));

//Home page
router.get('/home', ensureAuthenticated, (req, res) => res.render('home', {user_mv: req.user}));

//Create topic page
router.get('/create-topic', ensureAuthenticated, (req, res) => res.render('create-topic', {user_mv: req.user}));


//Register handle
router.post('/', (req, res) => {
    const {firstname, lastname, username, email, password} = req.body;
    let errors =[];

    if(!firstname || !lastname || !username || !email || !password) {
        errors.push({msg: 'Please check all fields.'});
    };
    //Check password length
    if(password.length < 6) {
        errors.push({msg: 'Password should be at least 6 characters.'});
    };
    if(errors.length > 0){
        res.render('register', {  
            errors,
            firstname,
            lastname,
            username,
            email,
            password
        });
    }else {
        //Validation passed
        User.findOne({email: email})
        .then(user => {
            if(user){
                //User exists
                errors.push({msg: 'Email is already registered.'})
                res.render('register', {
                    errors,
                    firstname,
                    lastname,
                    username,
                    email,
                    password
                });
            } else {
                const newUser = new User({ //Check User
                    firstname,
                    lastname,
                    username,
                    email,
                    password
                });
                //Hash password
                bcrypt.genSalt(10, (err, salt) => 
                bcrypt.hash(newUser.password,salt, (err, hash) => {
                    if(err) throw err;
                    //Set password to hash
                    newUser.password = hash;
                    //Save user
                    newUser.save()
                    .then(user => {
                        req.flash('success_msg', 'You are now registered and can now log in');
                        res.redirect('/login');
                    })
                    .catch(err => console.log(err));
                }))

            }
        });
        
    }
});



//Post handle
router.post('/create-topic', (req, res) => {
let newObj = {
    title: req.body.title,
    category: req.body.category,
    vista: req.body.vista,
    description: req.body.description
}
User.updateOne({username: user_mv.username}, { $set: {post: newObj}});
res.send('Hello');
//This is the code that does not work. Anything else I've tried has not worked.
});



//Login handle
router.post('/login', (req, res, next) => {
    passport.authenticate('local', {
        successRedirect: '/home',
        failureRedirect: '/login',
        failureFlash: true
    })(req, res, next);
});

module.exports = router;
const mongoose = require('mongoose');


const DBmusevistaSchema = mongoose.Schema({
    firstname: {
        type: String,
        required: false
    },
    lastname: {
        type: String,
        required: false
    },
    username: {
        type: String,
        required: false
    },
    email: {
        type: String,
        required: false
    },
    password: {
        type: String,
        required: false
    },
    date: {
        type: Date,
        default: Date.now
    }
});

const DBmusevista = mongoose.model('DBmusevista', DBmusevistaSchema);

module.exports = DBmusevista;

当个人访问我的网站时,起始页 ('/') 是我网站的注册。我对我的 MongoDB 集合有一个发布请求,该请求创建了一个“用户注册”对象(fname、lname、username、email、pass)。一旦登录('/home'),用户就可以创建一个新的帖子表单,该表单位于我的 create-topic.ejs 文件('/create-topic')中。我是使用 MongoDB 的新手,所以我的问题是如何将提交的帖子(标题、类别、远景、描述)附加到用户对象的数组中。

我不确定是否应该向 DBmusevistaSchema 添加一个数组 (posts: []) 并在我的 DBmusevista 文件中创建一个 Post.Schema({key: value})?我尝试使用 User.findOne 但我无法让它工作。请帮忙。

【问题讨论】:

  • 您是否希望帖子成为不同的集合,以便用户可以拥有 100 或 1000 条帖子并且您不想将所有帖子信息存储在用户集合中,而只是将 postIds 存储在用户集合中&当您想要帖子数据时,您会从帖子集合中查询它吗?或者,如果帖子数量非常少,您可以直接将整个帖子信息作为字段(数组或单个对象)直接存储在用户集合中!那你想做什么?
  • 我熟悉mysql数据库和制作关系表。我不认为 MongoDB 是那样的。我认为 Mongo 不是关系数据库。我的意图是制作一个“帖子数组”并在该数组中存储 100 或 1000 篇帖子。我猜这是个坏主意?我该怎么做?如何查询用户和帖子以获得我想要的结果?
  • 集合之间没有关系,除非您让您查询知道两个集合之间存在关系,只需使用 userID 查询用户集合,您就可以根据键(userID)从帖子集合中获取文档存储在帖子文档中(但所有插入用户或帖子集合的数据都是完全独立的)!!由您决定如何将数据存储到用户中,我不建议将 1000 个帖子对象存储在用户文档数组中,这会使用户文档变得庞大,因为用户收集至关重要(主登录页面数据)很简单..
  • 这完全取决于您希望如何访问门户上的数据,1)也许您可以为每个帖子文档提供用户文档(用户 ID)的参考并快速获取用户的所有帖子, 2)而不是将整个(1000个)posts对象存储在一个数组中(或者也)将1000个posts文档键(posts ids)存储在一个数组中......考虑您的数据需求和设计好:-)
  • 所以也许解决方案是:创建一个 Post 集合,然后为我的表单创建一个隐藏的输入字段并传递用户的 _id 作为值?

标签: node.js mongodb mongoose


【解决方案1】:
try {
  const pirs = await Pir.find();
  pirs.forEach(async (pir) => {
  let pir2 = new Pir();
  pir.isSubmitted = false;
  pir2 = pir;
  const out = await pir2.save();
  console.log(out);      
  });
} catch (err) {
  next(err);
}

【讨论】:

  • 欢迎来到 Stack Overflow。没有任何解释的代码转储很少有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请edit您的问题并解释它如何回答所提出的具体问题。见How to Answer
猜你喜欢
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
  • 2020-10-27
  • 2010-11-13
相关资源
最近更新 更多