首页 > 解决方案 > 尝试使用帖子信息填充用户文档,但我只有手动推送的用户 ID

问题描述

所以我试图获取帖子的标题,因为当我在用户仪表板上显示一系列帖子时,我只能在重定向它们时显示帖子的 ID,这有效......但我认为它会让用 TITLE 代替它更有意义。人口似乎没有将对象推入数组,也许我对人口的理解不正确,或者有更好的方法来解决它......谢谢。

在此处输入图像描述

这是该列表的反应代码

                <ol>
                    { user ? user.posts.map((item,i) => (
                    <React.Fragment key ={i}>
                            <li><Link to={`/api/posts/item/${item}`}>{item}</Link></li>
                            <button onClick={() => { setId(item) }}>Delete this post</button>
                    </React.Fragment>
                )) : null }
                </ol>

这是给我用户 ID 和填充 f(n) 的后端代码

        userModel.findOne({ email: req.body.author }, function(error, user) {

            const locationURL = req.files.map((item) => item.location);

            postModel.create({ ...req.body, image: locationURL }, (error, returnedDocuments) => {
                if (error) {
                    throw new Error(error);
                }

                user.posts.push(returnedDocuments._id);
                user.save((err) => {
                    console.log(err);
                });
            });

            // this will populate the posts field in our userSchema (which contain the id references to our posts)

            userModel.findOne({ email: req.body.author }).populate('posts').exec((err, user) => {
                user.save((err) => {
                    console.log(err);
                });
            });
        });

在用户文档中,它看起来像这样,一个 ID 数组

[
    {
        "premium": false,
        "max_posts": 62,
        "posts_made": 57,
        "posts": [
            "5e21252ac51ac82838947875",
            "5e212a6c3b1619294832a3f2"
        ],
        "_id": "5e0fe3f33c2edb2f5824ddf2",
        "email": "myemail@gmail.com",
        "createdAt": "2020-01-04T01:01:39.840Z",
        "updatedAt": "2020-01-17T03:36:36.086Z",
        "__v": 22
    }
]

在我的 userSchema 中,我引用了帖子...但也许我做错了,并且以某种方式可以访问该信息...

let User = new Schema(
    {
        email: {
            type: String,
            unique: true
        },
        premium: {
            type: Boolean,
            default:false
        },
        max_posts: {
            type: Number,
            default:3
        },
        posts_made: {
            type: Number,
            default:0
        },
        posts: [
            {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'Post'
            }
        ]
    },
    {
        timestamps: true
    }
);

我是否应该调用 axios 请求来获取我拥有的那些 ID 的名称,我有这个想法,但认为这可能是对数据库的不必要调用,这可能会变得昂贵。谢谢。

标签: javascriptreactjsmongodbexpressmongoose

解决方案


实际上,您正在正确填充,但不在正确的位置。您应该在回调中移动填充代码,并像这样发送结果。

    postModel.create({ ...req.body, image: locationURL }, (error, returnedDocuments) => {
        if (error) {
            throw new Error(error);
        }

        user.posts.push(returnedDocuments._id);

        user.save((err) => {
            if (err) {
              console.log(err);
              throw new Error(err);
            }

            userModel.findOne({ email: req.body.author }).populate('posts').exec((err, user) => {
              if (err) {
                console.log(err);
                throw new Error(err);
              }

              res.send(user); //user will have posts populated 
          });
        });
    });

推荐阅读