Node.js 带有ID数组的mongoose findOneAndUpdate回调

Node.js 带有ID数组的mongoose findOneAndUpdate回调,node.js,mongoose,Node.js,Mongoose,我在forEach循环中使用findOneAndUpdate创建/更新多个条目 我希望它返回它创建或更新的所有对象id的数组 在循环过程中,我可以看到它将数据添加到数组中,但当它离开循环时,数组是空的 是否不应填充阵列 这是我的密码 var softwareArray = ["Software1","Software2","Software3"], updatedArray = []; softwareArray.forEach(function(software){ Software

我在forEach循环中使用findOneAndUpdate创建/更新多个条目

我希望它返回它创建或更新的所有对象id的数组

在循环过程中,我可以看到它将数据添加到数组中,但当它离开循环时,数组是空的

是否不应填充阵列

这是我的密码

var softwareArray = ["Software1","Software2","Software3"],
updatedArray = [];

softwareArray.forEach(function(software){
    Software.findOneAndUpdate(
        {
            Name: software
        },
        {
            Name: software
        },
        {upsert:true},
        function(err, rows){
            updatedArray.push(rows._id);
            console.log(updatedArray); //This has data in it....
        }
    );
});
console.log(updatedArray); //This has no data in it...
编辑:使用我对Thiago的工作更改进行更新

var softwareArray = ["Software1","Software2","Software3"],
updatedArray = [];

loopSoftware(softwareArray, function(updatedArray){
    console.log(updatedArray);
    //carry on....
}

function loopSoftware(input, cb){
    var returnData = [];

    var runLoop = function(software, done) {
        Software.findOneAndUpdate(
            {Name: software},
            {Name: software},
            {upsert:true},function(err, rows){
                returnData.push(rows._id);
                done()
            }
        );
    };

    var doneLoop = function(err) {

        cb(returnData);

    };

    async.forEachSeries(input, runLoop, doneLoop);
}

当然,这会发生-就像节点上的任何其他网络一样,它是异步的

这意味着您为
findOneAndUpdate
操作指定的回调在到达
console.log(updateArray)时尚未运行代码


看看如何解决这个常见问题。

当然会发生这种情况-就像节点上的任何其他网络一样,它是异步的

这意味着您为
findOneAndUpdate
操作指定的回调在到达
console.log(updateArray)时尚未运行代码


看看如何解决这一常见问题。

我修饰了您的代码,让您看到发生了什么:

var softwareArray = ["Software1","Software2","Software3"],
updatedArray = [];

//  TIMESTAMP: 0

softwareArray.forEach(function(software){

    //  TIMESTAMP: 1, 2, 3

    Software.findOneAndUpdate(
        {
            Name: software
        },
        {
            Name: software
        },
        {upsert:true},
        function(err, rows){
            // TIMESTAMP: 5, 6, 7
            updatedArray.push(rows._id);
            console.log(updatedArray); // This has data in it....

            // want to use the result?
            if (updatedArray.length == softwareArray.length) {
                console.log(updatedArray);
            }
        }
    );
});

// TIMESTAMP: 4

console.log(updatedArray);

我修饰了你的代码,让你看到发生了什么:

var softwareArray = ["Software1","Software2","Software3"],
updatedArray = [];

//  TIMESTAMP: 0

softwareArray.forEach(function(software){

    //  TIMESTAMP: 1, 2, 3

    Software.findOneAndUpdate(
        {
            Name: software
        },
        {
            Name: software
        },
        {upsert:true},
        function(err, rows){
            // TIMESTAMP: 5, 6, 7
            updatedArray.push(rows._id);
            console.log(updatedArray); // This has data in it....

            // want to use the result?
            if (updatedArray.length == softwareArray.length) {
                console.log(updatedArray);
            }
        }
    );
});

// TIMESTAMP: 4

console.log(updatedArray);

在开始之前,请确保您理解并熟悉node.js中的异步流。如果是,您可以自己轻松回答这个问题。在开始之前,请确保您理解并熟悉node.js中的异步流。如果你是,你可以很容易地自己回答这个问题。谢谢,我假设我的循环会阻塞代码(一个类似的片段,没有mongoose,工作正常,所以我得出结论,这是我对mongoose做了错事),我已经重写了它,现在工作正常了。谢谢你,汉克斯,我假设我的循环会阻塞代码(一个类似的片段,没有mongoose,工作正常,所以我得出结论,这是我在mongoose上做的错事),我已经重写了它,现在工作正常了。谢谢你,汉克斯,我假设我的循环会阻塞代码(一个类似的片段,没有mongoose,工作正常,所以我得出结论,这是我在mongoose上做的错事),我已经重写了它,现在工作正常了。感谢you@greensmith你是怎么用async重写的?我试图填充一个“findOneAndUpdate”查询数组,但它没有以.save的形式返回函数。@Thiago Miranda de Oliveira我已在原始问题中添加了我的修订/工作代码。谢谢。谢谢,我假设我的循环会阻塞代码(一个类似的片段,没有mongoose,工作正常,所以我得出结论,这是我用mongoose做的错事),我已经重写了它,现在工作正常了。感谢you@greensmith你是怎么用async重写的?我试图填充一个“findOneAndUpdate”查询数组,但它没有以.save的形式返回函数。@Thiago Miranda de Oliveira我已在原始问题中添加了我的修订/工作代码。谢谢