Javascript 使用相同的更新时间戳对MongoDB文档进行排序?
我想用Javascript 使用相同的更新时间戳对MongoDB文档进行排序?,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我想用Supertest在我的Express服务器中测试路由。在该路径上,我将从MongoDB获取一个数据列表,该数据按照updatedAt字段进行排序 我想测试输出中的顺序是否正确,但我有一个问题——mongoDb似乎太快了,以至于有些文档具有相同的时间戳(我认为这是不可能的) 这在内部是如何分类的?它似乎也不是按id排序的。以下是我的测试中生成文档的函数: let first; let last; Array.from(Array(14)).forEach((e, i) => {
Supertest
在我的Express
服务器中测试路由。在该路径上,我将从MongoDB
获取一个数据列表,该数据按照updatedAt字段进行排序
我想测试输出中的顺序是否正确,但我有一个问题——mongoDb似乎太快了,以至于有些文档具有相同的时间戳(我认为这是不可能的)
这在内部是如何分类的?它似乎也不是按id排序的。以下是我的测试中生成文档的函数:
let first;
let last;
Array.from(Array(14)).forEach((e, i) => {
const immo = new Immo({ user: this.user.model });
immo.save();
if (i === 2) {
// last means last with limit 12 sorted by timestamps descending
last = immo._id.toString();
}
if (i === 13) {
// the last that was put in will be the first in the sorted list
first = immo._id.toString();
}
});
输出是用户编辑的最后12项。我保存第一个和最后一个,以便稍后在测试中断言它们
但是测试失败了,因为有3个或4个具有相同的时间戳,并且在Mongo按时间戳排序(或按降序排序)时,按照我将其放入数据库的顺序,实际上是最后一个的不是最后一个
我尝试在输入循环中通过for循环进行延迟,但没有任何效果。(我是否应该不使用Array.forEach?)
<> P><强>我能确保文件之间至少有几个MS延迟吗?< /强> ,我的问题是我没有考虑所有进程的异步性质。 我把所有的东西都包装在承诺里,现在一切都好了。这是我的新代码:
it('should return a list of the last 12 objects if a user has 14 objects', function (done) {
let first;
let last;
let i = 0;
const model = this.user.model;
(function recur() {
i += 1;
return new Immo({ user: model })
.save()
.then((result) => {
if (i === 3) {
last = result._id.toString();
} else if (i === 14) {
first = result._id.toString();
}
if (i >= 14) {
return result;
}
return recur();
});
}())
.then(() => {
this.request(this.app)
.get(url)
.set('Authorization', this.authHeader)
.expect(200)
.end((err, res) => {
if (err) {
done.fail(err.message);
} else {
expect(res.body.count).toBe(14);
expect(res.body.objects.length).toBe(12);
expect(res.body.objects[0]._id).toEqual(first);
expect(res.body.objects[11]._id).toEqual(last);
done();
}
});
});
由于我递归地使用生成函数,因此不确定这在ES2015
下是否有效
当我使用猫鼬自己的承诺时,猫鼬会抱怨。然后,我在测试设置功能的基础上执行此操作:
const mongoose = require('mongoose');
mongoose.Promise = require('q').Promise;
我希望在这个测试上浪费这么多时间是值得的:D