javascript - 多个查询以不可预测的排序结果结束

标签 javascript node.js mongodb express mongoose

我的数据库中有几百个文档。架构非常简单:

var firmsSchema = mongoose.Schema({
  name: String,
  sections: [String],
});

我想查询文档并迭代:

{{#each sections}}
  {{sectionName}}
  {{#each firms}}
    {{firmName}}
  {{/each}}
{{/each}}

简单:

const SECTIONS = ['name_one', 'name_two', 'name_three'];
const UNSORTED_SECTION_NAME = 'unsorted';

router.get('/', function(req, res, next) {
  var showFirms = function showSection (i, acc) {
    if (i < 0) return;
    let query = SECTIONS[i] ? {sections: SECTIONS[i]} : {sections: {$nin: SECTIONS}};
    let key = SECTIONS[i] || UNSORTED_SECTION_NAME;
    Firms.find(query).
    then((result) => {
      acc.push({
        section: key,
        firms: result,
      });
      if (i === SECTIONS.length) {
        acc = acc.sort((a, b) => (a.section > b.section));
        res.render('template', {
          sections: acc,
        });
      }
    }).
    then(showSection (i - 1, acc));
  }
  showFirms(SECTIONS.length, []);
};

工作正常。除非它返回 acc随机且不可预测地排序。我的意思是'name_two'部分可以跟随 'name_one'反之亦然。

我以为.sort()在 promise 链的末尾将是一个 Elixir ,可以解决所有异步问题,但事实并非如此。

我当然可以排序acc在我将它传递给我的模板后,使用 Handlebars 助手,但这太奇怪了,在我的 showFirms 中完成所有查询后,我无法对其进行排序功能。

您能给我一些建议吗?

最佳答案

看看你的代码的重制版。我们不必逐一获取数据,而是同时(异步)获取它们,然后处理返回。

如果您对我这里有任何疑问,此代码未经测试,因此请给我反馈。这是如何更改代码的示例。

const showFirms = function showSection() {
  return new Promise((resolve, reject) => {
    // Get the keys for the queries
    const keys = SECTIONS.map(x => x || UNSORTED_SECTION_NAME);

    // For each sections we gonna call a find request
    const promises = SECTIONS.map((x, xi) => {
      const query = x ? {
        sections: x,
      } : {
        sections: {
          $nin: SECTIONS,
        },
      };

      const key = keys[xi];

      return Firms.find(query);
    });

    // Resolve all promises
    Promise.all(promises)
      .then((rets) => {
        // Use the finds results to build an acc array
        const accs = rets.map((x, xi) => ({
          section: keys[xi],
          firms: x,
        }));

        // Change the sort -> ;) #comments
        const sortedAccs = accs.sort((a, b) => (a.section > b.section));

        resolve(sortedAccs);
      })
      .catch(reject);
  });
};
<小时/>

如何使用

showFirms()
  .then(accs => res.render('template', {
    sections: accs,
  }))
  .catch(err => console.log(`I have an error ${err.toString()}`));

关于javascript - 多个查询以不可预测的排序结果结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46360655/

相关文章:

javascript - Puppeteer:在waitForNavigation 后page.evaluate 不起作用,调试在page.evaluate 内部不起作用

mongodb - 最小的 mongodb 数据文件大小是多少

javascript - document.referrer 在 SSL 重定向的 firefox 和 chrome 中为空白

javascript - 更改 contenteditable div HTML 并将光标移动到末尾不起作用

javascript - 分割字符串并返回对象

javascript - 同步上传多个文件到 s3 安全吗?

javascript - 如何在javascript中使用shift + click?

node.js - nodeS CORS 的问题

hibernate - 如何为按关系计数(一对多)排序的所有实例创建条件?

algorithm - 在 mongodb 中使用索引的运行时