如何使用mongodb更新双嵌套数组中的对象?

时间:2020-02-08 06:44:41

标签: node.js mongodb

const AnswerModel = new Schema({
    questionid: {
        type: Schema.Types.ObjectId,
        ref: 'questionsModel'
    }
    ,
    allanswers: [{
        user: { type: Schema.Types.ObjectId, ref: 'users' },
        answers: [{
            answer: {
                type: String,

            },
            isTrue: {
                type: Boolean,
                default: false
            },
            date: {
                type: Date,
                default: Date.now
            }

        }]

    }]
})

Answers.findOneAndUpdate({ questionid: ObjectId(req.body.questionid) },
                    {
                        $set: { allanswers: { user: ObjectId(req.body.userid) } },
                        $push: { answers: { answer: req.body.answer } }
                    },
                    { useFindAndModify: false }
                )
                    .then(res => console.log(res))
                    .catch(err => console.log(err))

上面的查询在allanswers数组中设置了用户名,但没有将新对象推送到Answers数组中。每当有人提交新答案时,我要匹配questionid,请检查用户是否已提交并之前回答,我可以通过以下方式进行操作:

  Answers.findOne({ questionid: ObjectId(req.body.questionid) })
        .then(onequestionanswer => {
            if (onequestionanswer.allanswers.filter(oneuseranswers => oneuseranswers.user.toString() === req.body.userid).length === 0)

然后,如果还没有,我想在allanswers中设置一个新用户并添加答案答案,如果用户在我想与allanswers数组中的用户匹配之前已经提交了答案,则将新答案推送到答案数组中。有没有一种方法可以在一个查询中做到这两个,如果没有,我该如何解决我的查询以将答案推送到答案数组中的问题?

1 个答案:

答案 0 :(得分:0)

尝试此代码,我认为它是可行的。

Answers.findOne({
    $and: [
        {
            questionid: ObjectId(req.body.questionid)
        },
        {
            'allanswers.user': ObjectId(req.body.userid)
        }]
}).exec(function (err, result) {
    if (err) {
        console.log(err)
    } else if (result) {
        //if user match then push answer in answers array
        const ansObj = {    // your ans object
            answer: req.body.answer,
            isTrue: false,
            date: new Date()
        }
        Answers.findOneAndUpdate({
            $and: [
                { questionid: ObjectId(req.body.questionid) },
                { 'allanswers.user': ObjectId(req.body.userid) }
            ]
        },
            {
                $push: { 'allanswers.$.answers': ansObj }
            },
        ).exec(function (err, result) {
            console.log(err, 'errerrerr')
            console.log(result, 'resultresultresult')
        })
    } else {
        //if user id not match push object in allanswers array
        const FirstAnsObj = {     //your ans object
            user: new ObjectId(),
            answers: [{
                answer: req.body.answer,
                isTrue: false,
                date: new Date()
            }]
        }
        Answers.findOneAndUpdate({ questionid: ObjectId(req.body.questionid) },
            {
                $push: { allanswers: FirstAnsObj }
            },
        ).exec(function (err, result) {
            console.log(err, 'errerrerr')
            console.log(result, 'resultresultresult')
        })
    }
})
  • 第一个检查用户是否存在
  • 如果用户存在,则秒在answers数组中推送答案
  • 如果用户不存在,则排名第三,然后将用户推送到allanswers数组中
相关问题