鍍金池/ 問答/數(shù)據(jù)庫/ mongoose 多個save方法保存如何獲取總的保存結(jié)果?

mongoose 多個save方法保存如何獲取總的保存結(jié)果?

操作數(shù)據(jù)庫文件:projectDao.js
var mongoose = require('mongoose')
const Project = mongoose.model('Project')
exports.createProject = async(data) => {
    data.m.projectModelId=data.m.projectModel.split(',')[0]
    data.m.projectModelName=data.m.projectModel.split(',')[1]
    delete data.m.projectModel
    let project = new Project(data.m)
    let flag1= false
    let flag2=false
    let flag3=false
    await project.save(function (err) {
        if (err) {
            flag1 = false
            return console.error(err)
        }else{
            flag1=true
            return Promise.resolve(flag1)
        }
    })
    console.log(flag1)
    let formModels = new ProjectData(data.formModels)
    await formModels.save(function (err) {
        if (err) {
            flag2 = false
            return console.error(err)
        }else{
            return flag2=true
        }
    })
    let tableModels = new ProjectData(data.tableModels)
    await tableModels.save(function (err) {
        if (err) {
            flag3 = false
            return console.error(err)
        }else{
            return flag3=true
        }
    })
    if(flag1&flag2&&flag3){
        return true
    }
}

controller:

//創(chuàng)建項目api
exports.createProject = async (ctx) => {
    const result = projectDao.createProject(ctx.request.body)
    ctx.body = {
        result
    }
}

如上,我想實現(xiàn)同一個方法里有多個save方法,一部分保存在一個表,另一部分保存在別的表,如何同時執(zhí)行多個保存方法之后獲取到總的結(jié)果,因為async, await是異步方法,外面獲取到的flag的值實際是不變的。

如果三個save是有先后關系的,即第一個save存儲成功之后拿到的id存入第二個save中,又該如何寫更好?

exports.createProject =(data) => {
    data.m.projectModelId=data.m.projectModel.split(',')[0]
    data.m.projectModelName=data.m.projectModel.split(',')[1]
    delete data.m.projectModel
    let project = new Project(data.m)
    project.save(function (err, info) {
        if (err) {
            console.error(err)
        } else {
            for(let i=0;i<data.formModels.length;i++){
                let formModel = new ProjectData({projectId:info._id,projectSubmoduleId:data.formModels[i]._id,createUserId:info.createUserId,createUserName:info.createUserName})
                formModel.save(function (err,formData) {
                    if (err) {
                        return console.error(err)
                    }else{
                        return console.log(formData)
                    }
                })
            }
            for(let i=0;i<data.tableModels.length;i++){
                let tableModel = new ProjectData({projectId:info._id,projectSubmoduleId:data.tableModels[i]._id,createUserId:info.createUserId,createUserName:info.createUserName})
                tableModel.save(function (err,tableData) {
                    if (err) {
                        return console.error(err)
                    }else{
                        return console.log(tableData)
                    }
                })
            }
        }
    })
}
回答
編輯回答
獨白

不是 mongodb 的問題,是 Promise 使用的問題,如果你的3個 save 沒有先后關系的話可以用 Promise.all:

var mongoose = require('mongoose')
const Project = mongoose.model('Project')
exports.createProject = async(data) => {
    data.m.projectModelId=data.m.projectModel.split(',')[0]
    data.m.projectModelName=data.m.projectModel.split(',')[1]
    delete data.m.projectModel
    const p1 =  new Project(data.m).save()
    const p1 =  new ProjectData(data.formModels).save()
    const p1 =  new ProjectData(data.tableModels).save()
    try {
        await Promise.all([p1, p1, p3])
        console.log('save success')
    } catch (e) {
        console.log('save failed')
    }
}
2017年5月3日 10:33
編輯回答
貓小柒

可以試試co,可以let save1=yield project.save();這樣就能拿到操作后數(shù)據(jù)的結(jié)果了。

2017年5月15日 05:16
編輯回答
護她命

異步流程控制其實是NodeJS的基礎知識,跟MongoDB沒什么直接聯(lián)系。你要理解的應該是Promise如何工作。如果你需要上面的保存動作逐一完成,應該使用Promise.each。但實際上你的幾個操作從上面看起來并沒有因果關系,因此應該同時進行更有效率,也就是Promise.all。
你的代碼看上去有點奇怪,我想知道

let project = new Project(data.m)

這里的Project是怎么定義的,因為

await project.save(function (err) {...}

這里既有await又有callback,兩者不應該同時出現(xiàn)。

2017年7月15日 16:33