【问题标题】:Mongoose's push acting weird猫鼬的推动行为怪异
【发布时间】:2021-02-27 11:34:34
【问题描述】:

所以我在过去的 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将我所有的东西推送到不同的集合中,它可以工作

【问题讨论】:

  • 你能准确地显示你的posts 路径是一个数组吗?那么你能不能更具体一点:posts: Array。 mongoose 非常注重根据您在模式中的具体内容,您可以将什么推入数组中。它可能只是忽略了 save() 上推送的文档,因为它们不符合预期。
  • codemonkey,对不起,我不知道你的意思。我将帖子指定为数组,你是说我应该做posts: []
  • 这里是 mongoose 中的典型模式路径:posts: [String],它告诉 mongoose 您将在该字段中放入一个字符串数组。看起来您正在将一组对象推入其中,因此您的架构实际上应该如下所示:posts: [new mongoose.Schema({})],它将告诉 mongoose 它将是一个任意对象的数组。
  • 我试试吧
  • 好吧,所以我尝试了这个:js const postsSchema = new mongoose.Schema({ _id: String, posts: [new mongoose.Schema({})], upvotes: Number, downvotes: Number, fans: Array, dmUserWhenUpvoted: Boolean, dmUserWhenDownVoted: Boolean }) const postsModel = mongoose.model("Posts",postsSchema) 但现在它也没有推送对象,它只是在里面添加了一些随机的东西:{粉丝:[],_id:'715956009327263858',帖子:[ { _id: 60399ccd4b2d2833e46cdc88 } ], upvotes: 0, downvotes: 0, dmUserWhenUpvoted: false, dmUserWhenDownVoted: false, __v: 21 }

标签: arrays mongodb mongoose


【解决方案1】:

好的,事实证明,您实际上甚至不需要使用 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))

【讨论】:

    猜你喜欢
    • 2018-04-13
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2019-10-13
    • 2018-08-30
    相关资源
    最近更新 更多