【发布时间】:2019-01-22 18:06:43
【问题描述】:
我正在尝试将以下数据播种到我的 MongoDB 服务器:
const userRole = {
role: 'user',
permissions: ['readPost', 'commentPost', 'votePost']
}
const authorRole = {
role: 'author',
permissions: ['readPost', 'createPost', 'editPostSelf', 'commentPost',
'votePost']
}
const adminRole = {
role: 'admin',
permissions: ['readPost', 'createPost', 'editPost', 'commentPost',
'votePost', 'approvePost', 'approveAccount']
}
const data = [
{
model: 'roles',
documents: [
userRole, authorRole, adminRole
]
}
]
当我尝试遍历此对象/数组并将此数据插入数据库时,我最终得到了三个“adminRole”副本,而不是三个单独的角色。无法弄清楚为什么会发生这种情况,我感到非常愚蠢。
我实际遍历对象并为其播种的代码如下,我知道它实际上获取了每个值,因为我已经完成了 console.log 测试并且可以正确获取所有数据:
for (i in data) {
m = data[i]
const Model = mongoose.model(m.model)
for (j in m.documents) {
var obj = m.documents[j]
Model.findOne({'role':obj.role}, (error, result) => {
if (error) console.error('An error occurred.')
else if (!result) {
Model.create(obj, (error) => {
if (error) console.error('Error seeding. ' + error)
console.log('Data has been seeded: ' + obj)
})
}
})
}
}
更新:
这是我在阅读了大家的回复后想出的解决方案。两个私有函数生成 Promise 对象,用于检查数据是否存在以及插入数据,然后所有的 Promise 都通过 Promise.all 实现。
// Stores all promises to be resolved
var deletionPromises = []
var insertionPromises = []
// Fetch the model via its name string from mongoose
const Model = mongoose.model(data.model)
// For each object in the 'documents' field of the main object
data.documents.forEach((item) => {
deletionPromises.push(promiseDeletion(Model, item))
insertionPromises.push(promiseInsertion(Model, item))
})
console.log('Promises have been pushed.')
// We need to fulfil the deletion promises before the insertion promises.
Promise.all(deletionPromises).then(()=> {
return Promise.all(insertionPromises).catch(()=>{})
}).catch(()=>{})
我不会同时包含 promiseDeletion 和 promiseInsertion,因为它们在功能上是相同的。
const promiseDeletion = function (model, item) {
console.log('Promise Deletion ' + item.role)
return new Promise((resolve, reject) => {
model.findOneAndDelete(item, (error) => {
if (error) reject()
else resolve()
})
})
}
更新 2:您应该忽略我最近的更新。我已经修改了我发布的结果,但即便如此,有一半的时间角色被删除而不是插入。何时将角色实际插入服务器是非常随机的。在这一点上,我感到非常困惑和沮丧。
【问题讨论】:
标签: javascript node.js mongodb mongoose