猫鼬的推动作很奇怪

时间:2021-02-26 23:49:14

标签: arrays mongodb mongoose

所以我过去 2 天都在研究这个,我快疯了,这是我的代码(部分):

const mongoose = require('mongoose')

    mongoose.connect('',{
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useFindAndModify: false
})

const postsSchema = new mongoose.Schema({
    _id: String,
    posts: Array,
    upvotes: Number,
    downvotes: Number,
    fans: Array,
    dmUserWhenUpvoted: Boolean,
    dmUserWhenDownVoted: Boolean
})

const postsModel = mongoose.model("Posts",postsSchema)




    /**
     *
     * @param {Object} user
     */
    async function getPosts(user){
        if(!user) user = message.author

        let posts = await postsModel.findOne({_id: user.id})
        if(posts === null){
            let newData = new postsModel({
                _id: user.id,
                posts: [],
                upvotes: 0,
                downvotes: 0,
                fans: [],
                dmUserWhenUpvoted: false,
                dmUserWhenDownVoted: false
            })

            await newData.save()
            posts = await postsModel.findOne({_id: user.id})
        }

        return {
            _id: user.id,
            posts: posts.posts,
            upvotes: posts.upvotes,
            downvotes: posts.downvotes,
            fans: posts.fans,
            dmUserWhenUpvoted: posts.dmUserWhenUpvoted,
            dmUserWhenDownVoted: posts.dmUserWhenDownVoted,
            account: posts
        }
    }

这些是我用来推送的两种方法:

                    let getposts = await getPosts()

                    postsModel.updateOne(
                        {_id: message.author.id},
                        {
                          "$push": {
                            "posts": {
                                id: s.id,
                                upvotes: 0,
                                downvotes: 0
                            },
                          }
                        },
                        function(err, response) {
                         console.log(err)
                         console.log(response)
                        }
                      )

                    console.log(getposts.account)
                    await message.delete()

当我登录 posts.account 并且错误日志为 null

时,此方法不会推送任何内容

方法二:

                    let getposts = await getPosts()

                    getposts.account.posts.push({
                        id: s.id,
                        upvotes: 0,
                        downvotes: 0
                    })

                    await getposts.account.save(function(err){
                      console.log(err)
                    });

                    console.log(getposts.account)
                    await message.delete()

当我登录 getposts.account 时,它会记录其中包含推送对象的数组(帖子),但是当我转到我的仪表板并查看我的收藏时,它是空的。希望有人能帮我解决我的问题,这个问题 only 出现在这部分代码中,我使用方法 2 将我所有的东西推送到不同的集合中,并且它有效

1 个答案:

答案 0 :(得分:0)

好的,事实证明您实际上甚至不需要使用 posts: [new mongoose.Schema({}, {versionKey: false, _id: false})] 指定任意 mongoose 对象的数组。这将完成相同的工作:posts: Array,无论如何,这就是您最初拥有的。

假设您的 Posts 集合中只有一个文档:

{
        "_id" : ObjectId("6039b9ff08e0c46c9c04f963"),
        "fans" : [ ],
        "posts" : [ ],
        "upvotes" : 0,
        "downvotes" : 0,
        "dmUserWhenUpvoted" : false,
        "dmUserWhenDownVoted" : false,
}

如您所见,posts 字段为空。要将新的帖子对象推送到其中,您将需要此代码(或其变体):

const postsModel = mongoose.model('Posts');

const addPosts = () => {
    postsModel.findOne({_id: '6039b9ff08e0c46c9c04f963'})
        .then(post => {
            post.posts.push({
                id: 'some_id_here',
                upvotes: 0,
                downvotes: 0
            })
            post.save()
        })
}
addPosts()

我更像是一个then人,但如果你更喜欢awaiting,它看起来像这样:

const postsModel = mongoose.model('Posts');

const addPosts = async () => {
    const post = await postsModel.findOne({_id: '6039b9ff08e0c46c9c04f963'})
    post.posts.push({
        id: 'some_id_here_1',
        upvotes: 0,
        downvotes: 0
    });

    await post.save();
    return 'ok';
}
addPosts().then(r => console.log(r))