Javascript 在一系列MongoDB插入中,我希望引用先前插入项的objectId
我想在MongoDB中插入一系列文档,其中每个文档都必须引用以前插入的条目。如果多米诺骨牌是下一个坠落的物体,那么它会意识到被它撞倒的物体 比方说,我在数据库中插入了三个domino片段,我希望获得以下结果(插入时由MongoDB生成的\u id) 我尝试了以下方法: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
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')
})