如何在Mongoose中修改结果查询,而不影响实际文档?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Mongoose中修改结果查询,而不影响实际文档?相关的知识,希望对你有一定的参考价值。

状态(截至5/4/2020):未解决。我尝试做lean()并且document.count现在可以吸收值,但是无法推送到接收变量。

尽管我们正在经历全球危机,我希望一切都很好。我目前正在做一个学校的网络项目,需要呈现分配给我的特定功能。我正在Express中使用Mongoose,并使用了模板进行处理。请参阅下面的随附的模型架构和说明。

collegeModel-集合A

var collegeSchema = new Schema({
    shortName: {type: String},  //value that I intend to synchronously query its occurrence with Collection B
    longName: {type: String},
    logo: {type: String},
    contactUs:{
        telNum: {type: String},
        faxNum: {type: String},
        email: {type: String}
    },
    aboutUs: {type: Array},
    visionMission: {type: String},
    coreValues: {type: String},
    goals: {type: String},
    founderBio: {type: String},
    philosophy: {type: String},
    icon: {type: String}
});

professorModel-集合B

var professorSchema = new Schema({
    profNumber: {type: Int32},
    college: {type: String},    //value to be compared with shortName
    gender: {type: String},
    profName: {type: String},
    profCourse: {type: String}
});

伪代码-所需的逻辑要实现

app.get('/testCount', function(req,res) {
    collegeModel.find({}).lean().exec(function(err,collegeRes){
        var collegeObject = [];
        collegeRes.forEach(function(document){
            professorModel.countDocuments({college:document.shortName}, function(err2,professorCount){
                document.count = professorCount;
                collegeObject.push(document);   //doing a console.log(collegeObject) would return empty objects [].
            });
        });
    });
});

我不知道我在做什么错,我知道document.count存在,因为每次我执行console.log(document.count)时它都会返回一个值,但是当按下它时它将变成[]。希望你能帮助我实现我的目标。谢谢!

答案

您的查询以异步方式解析,您必须找到一种方法来等待所有查询完成,以确保您拥有所需的所有数据。

解决此问题的一种方法是使用async/await(Node.js> = 7.6.0)

async/await

使用app.get('/testCount', async function(req, res) { // note the async keyword const collegeRes = await collegeModel.find({}).lean().exec() // .exec() returns a Promise, so you can `await` it. const resultPromises = collegeRes.map(async college => { // arrow function is equivalent to function in this context const professorCount = await professorModel.countDocuments({ college: college.shortName }) college.count = professorCount return college }) const collegeObject = await Promise.all(resultPromises) console.log(collegeObject) }) 中的Promise.map更具可读性,或者您也可以使用其他Promise实用程序库

Promise.map

以上是关于如何在Mongoose中修改结果查询,而不影响实际文档?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 查询结果是只读的吗?

Mongoose 查询结果是只读的吗?

NodeJs中怎么修改 mongoose 查询到的值

Mongoose 回调函数如何知道第二个参数是啥 db.query 结果?

Mongoose 回调函数如何知道第二个参数是啥 db.query 结果?

如何在表单提交时发送ajax请求而不影响实际表单