Mongoose/Mongodb 数据库调用以不一致的顺序返回数据
Posted
技术标签:
【中文标题】Mongoose/Mongodb 数据库调用以不一致的顺序返回数据【英文标题】:Mongoose/Mongodb database call returns data in an inconsistent order 【发布时间】:2018-09-19 09:20:27 【问题描述】:我正在查询两个不同的集合。第一个包含我要查找的大部分数据,包括链接到第二个集合的 _id。使用这个 _id,我想在第二个集合中搜索正确的文档并获取 Name 值。
我遇到的问题是 2 倍(1 比另一个重要得多)。
1 - 首次加载调用的页面时,它运行良好。如果我刷新页面,并且在所有后续刷新时,它将失败。当我第二次记录元素和索引时,我将获得正确的对象,但索引将被反转(1, 0 而不是 0, 1),并且不会从 api 调用返回任何内容。我想知道为什么会发生这种情况以及解决它的任何方法。
2 - 这是一个小得多的问题。如果我更改 allStudents[i].Teacher = teacherData.Name;
替换现有字段的值,那么它就可以正常工作。但是,如果我将其更改为 allStudents[i].TeacherName = teacherData.Name;
,它正在向对象添加一个新字段,那么它根本不会添加任何内容。我不明白为什么我无法向对象添加新字段,即使我以前从未遇到过这个问题?
export const getAllStudents = (req, res) =>
Student.find(
UserType: "STUDENT" ,
req.query.fields
)
.then(data =>
console.log('line 34')
if (data)
let allStudents = [];
data.forEach((e, i) =>
console.log('line 38', e.Teacher);
Teacher.findOne(
_id: e.Teacher ,
'Name'
)
.then(teacherData =>
console.log('line 44', e, i === data.length - 1)
allStudents.push(e);
if (studentData && i !== data.length - 1)
allStudents[i].Teacher = teacherData.Name;
else if (partnerData)
allStudents[i].Teacher = teacherData.Name;
console.log('line 50')
res.json( data: allStudents ).status(200);
else res.json( message: "No Teacher is associated with this user." ).status(401);
)
.catch(err => res.json( message: "No Teacher is associated with this user." ).status(401));
)
else res.json( message: "No student could be found." ).status(401);
)
.catch(err => res.json( message: "No student could be found." ).status(401));
console.log 输出如下:
[0] line 44 _id: 5ab94d69418a5132507d5b41,
[0] FirstName: 'PersonA',
[0] LastName: 'Lastname',
[0] Email: 's@example.ca',
[0] Teacher: '5ab94d69418a5132507d5b60' 0 false
[0] line 44 _id: 5ab94d69418a5132507d5b42,
[0] FirstName: 'PersonB',
[0] LastName: 'Lastname',
[0] Email: 'student@example.com',
[0] Teacher: '5ab94d69418a5132507d5b60' 2 true
[0] line 44 _id: 5ab94d69418a5132507d5b39,
[0] FirstName: 'PersonC',
[0] LastName: 'Lastname',
[0] Email: 'a@exmple.ca',
[0] Teacher: '5ab94d69418a5132507d5b59' 1 false
【问题讨论】:
forEach
是同步的基本问题,而 Mongoose 操作与 ***.com/questions/49639236/… 是异步的
【参考方案1】:
我通过创建两个基本的 api 调用解决了这个问题,然后在我的 Redux Action 中组织了数据。
【讨论】:
以上是关于Mongoose/Mongodb 数据库调用以不一致的顺序返回数据的主要内容,如果未能解决你的问题,请参考以下文章
详解node+mongoose+mongoDb(mongoDb安装运行,在node中链接)
从两个数据库集合(Mongoose/MongoDB)中查询和匹配