Node.js 如何在我的MongoDB数组中推送{key:value}对象?

Node.js 如何在我的MongoDB数组中推送{key:value}对象?,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我试图通过将帖子推送到我为其创建的数组中来更新我的用户对象。我尝试了几种不同的方法,但到目前为止,还没有任何方法能够工作或更新用户对象。我是MongoDB的新手,但到目前为止,我真的很喜欢它,并且很高兴能更多地使用它。我做错了什么 //主页 get('/home',ensureAuthenticated,(req,res)=>res.render('home',{user_mv:req.user})); //创建主题页 get('/create-topic',ensureAuthenticat

我试图通过将帖子推送到我为其创建的数组中来更新我的用户对象。我尝试了几种不同的方法,但到目前为止,还没有任何方法能够工作或更新用户对象。我是MongoDB的新手,但到目前为止,我真的很喜欢它,并且很高兴能更多地使用它。我做错了什么

//主页
get('/home',ensureAuthenticated,(req,res)=>res.render('home',{user_mv:req.user}));
//创建主题页
get('/create-topic',ensureAuthenticated,(req,res)=>res.render('create-topic',{user\u mv:req.user}));
//柱柄
router.post('/create topic',(req,res)=>{
update({u id:req.body.User\u id},
{
$push:{
邮资:{
标题:req.body.title,
类别:req.body.category,
vista:req.body.vista,
描述:req.body.description
}
}   
});
res.send(请求主体用户标识);
});
const DBmusevistaSchema=mongoose.Schema({
名字:{
类型:字符串,
必填项:false
},
姓氏:{
类型:字符串,
必填项:false
},
用户名:{
类型:字符串,
必填项:false
},
电邮:{
类型:字符串,
必填项:false
},
密码:{
类型:字符串,
必填项:false
},
日期:{
类型:日期,
默认值:Date.now
},
邮资:[
{
标题:{
类型:字符串,
必填项:false
},
类别:{
类型:字符串,
必填项:false
},
vista:{
类型:字符串,
必填项:false
},
说明:{
类型:字符串,
必填项:false
}
}
]
});

您的
更新
语法很好

req.body.user\u id
以字符串形式出现(假设您不使用任何特定的中间件来重新转换它)

您所要做的就是创建一个
ObjectId
类型。像这样:

var ObjectID = require('mongodb').ObjectID
然后:

{_id: new ObjectId(req.body.user_id)}
{_id: new mongoose.Types.ObjectId(req.body.user_id)}
编辑:

尝试并等待从
更新
返回的承诺,它应该仍然可以工作,而不必等待它,但在没有看到整个代码的情况下,我不能确定

这样做:

//Post handle
router.post('/create-topic', async (req, res) => {
     let updateResult = await User.update( {_id:  mongoose.Types.ObjectId(req.body.user_id)},
        {
            $push: {
                postArr: {
                    title: req.body.title,
                    category: req.body.category,
                    vista: req.body.vista,
                    description: req.body.description
                }
            }   
        });
    res.send(req.body.user_id);      
});
此外,我还看到您正在使用mongoose,因此您可以使用以下API代替安装Mongo的API:

var mongoose = require('mongoose')
然后:

{_id: new ObjectId(req.body.user_id)}
{_id: new mongoose.Types.ObjectId(req.body.user_id)}

您的
更新
语法很好

req.body.user\u id
以字符串形式出现(假设您不使用任何特定的中间件来重新转换它)

您所要做的就是创建一个
ObjectId
类型。像这样:

var ObjectID = require('mongodb').ObjectID
然后:

{_id: new ObjectId(req.body.user_id)}
{_id: new mongoose.Types.ObjectId(req.body.user_id)}
编辑:

尝试并等待从
更新
返回的承诺,它应该仍然可以工作,而不必等待它,但在没有看到整个代码的情况下,我不能确定

这样做:

//Post handle
router.post('/create-topic', async (req, res) => {
     let updateResult = await User.update( {_id:  mongoose.Types.ObjectId(req.body.user_id)},
        {
            $push: {
                postArr: {
                    title: req.body.title,
                    category: req.body.category,
                    vista: req.body.vista,
                    description: req.body.description
                }
            }   
        });
    res.send(req.body.user_id);      
});
此外,我还看到您正在使用mongoose,因此您可以使用以下API代替安装Mongo的API:

var mongoose = require('mongoose')
然后:

{_id: new ObjectId(req.body.user_id)}
{_id: new mongoose.Types.ObjectId(req.body.user_id)}

我添加了var ObjectID=require('mongodb').ObjectID,然后添加了_id:new ObjectID(req.body.user_id),但它没有更新。知道我必须传递id和ObjectId才能让它工作,这真的很有帮助。我也没有收到任何错误,res-send可以正常工作。此外,如果没有您建议的更改,user\u-id-send将id发送到res中,但没有报价,并且发送您在res中的更改。send将id用双引号括起来。我不理解第二条评论,但没有错误这一事实是很好的进展,接下来,您应该确保收到的id与集合中的文档匹配。该id与用户res.send(req.body.user)发送的5e248598f8cf6520084b6060和res.send(new ObjectID(req.body.user_id)发送的“5e248598f8cf6520084b6060”匹配。它成功了!非常感谢。我将研究那里正在发生的事情,看看我能从中理解什么,看看我将来如何使用它。我添加了var ObjectID=require('mongodb').ObjectID,然后添加了_id:new ObjectID(req.body.user_id)但是它没有更新。知道我必须传递id和ObjectId才能让它工作真的很有帮助。我也没有收到任何错误,res send可以工作。同样没有你建议的更改,user_id send发送了id,没有引用,并且发送了你在res中的更改。send将id用双引号括起来。我不理解第二条评论,但是没有错误这一事实是一个良好的进展,接下来您应该确保收到的id与集合中的文档匹配。id与用户res.send(req.body.user)发送的5e248598f8cf6520084b6060和res.send(new ObjectID(req.body.user_id)发送的“5e248598f8cf6520084b6060”匹配.成功了!非常感谢。我将研究那里发生的事情,看看我能从中了解到什么,看看我将来如何使用它。