Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在一系列MongoDB插入中,我希望引用先前插入项的objectId_Javascript_Node.js_Mongodb_Mongoose_Ecmascript 6 - Fatal编程技术网

Javascript 在一系列MongoDB插入中,我希望引用先前插入项的objectId

Javascript 在一系列MongoDB插入中,我希望引用先前插入项的objectId,javascript,node.js,mongodb,mongoose,ecmascript-6,Javascript,Node.js,Mongodb,Mongoose,Ecmascript 6,我想在MongoDB中插入一系列文档,其中每个文档都必须引用以前插入的条目。如果多米诺骨牌是下一个坠落的物体,那么它会意识到被它撞倒的物体 比方说,我在数据库中插入了三个domino片段,我希望获得以下结果(插入时由MongoDB生成的\u id) 我尝试了以下方法: let parentId = null; dominos.map(domino => { domino.parentId = parentId; return storeItem(domino) // calls

我想在MongoDB中插入一系列文档,其中每个文档都必须引用以前插入的条目。如果多米诺骨牌是下一个坠落的物体,那么它会意识到被它撞倒的物体

比方说,我在数据库中插入了三个domino片段,我希望获得以下结果(插入时由MongoDB生成的\u id)

我尝试了以下方法:

let parentId = null;
dominos.map(domino => {
  domino.parentId = parentId;
  return storeItem(domino)   // calls Model.create and returns _id
    .then((result) => {
      parentId = result; // a console.log would print the latest _id
    })
    .catch(error => error);
})
问题是.then子句中接收到的parentId没有向上传播,因此即使插入第二个和第三个项,
domino.parentId=parentId
仍保持为空

我相信无论是在范围还是承诺上,我都遗漏了一点。任何建议如何使这项工作或可能是另一种更可行的方法将不胜感激

问候
-act

安装异步依赖项

npm install --save async
试试这个

const async = require('async')

let parentId = null

async.each(dominos, 
    function(domino, callback) {
        domino.parentId = parentId;
        storeItem(domino)
        .then((result) => {
            parentId = result
            callback()
        })
    }, function (err) {
        console.log('success')
    })

正如@Mikey在另一个答案中的评论所暗示的:

在这种情况下,可能应该使用async.eachSeries()

使用async.eachSeries确实帮了我的忙-谢谢


-act

parentId=result
将在映射所有多米诺骨牌后执行。你需要约束你的承诺。您正在异步地、独立地进行插入。在插入上一个元素后,只能插入一个元素。您还可以在客户端生成所有ID并同时插入准备好的数据。无需等待以前的插入。在这种情况下,可能应该使用。
const async = require('async')

let parentId = null

async.each(dominos, 
    function(domino, callback) {
        domino.parentId = parentId;
        storeItem(domino)
        .then((result) => {
            parentId = result
            callback()
        })
    }, function (err) {
        console.log('success')
    })