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)中查询和匹配

创建 Mongoose/MongoDB 常量文档

Mongoose/MongoDB:$in 和 .sort()

Mongoose/MongoDB:获取倒数第二个文档

Mongoose/MongoDB 如果不存在则基于 Schema 创建集合