我的数据库中有几百个文档。架构非常简单:
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/