使用猫鼬操纵createdAt字段

时间:2017-08-03 08:13:24

标签: javascript mongoose

出于测试目的,我想控制MongoDb对象中的createdAt字段。不幸的是,我担心标准timestamp实施不可能做到这一点。这是我用来创建一些对象然后设置其创建的时间戳的代码的要点:

const docArray = [];
const times = [15, 32, 1233, 122].map(seconds => moment().add(seconds, 'seconds'));

for (let i = 0; i < times.length; i += 1) {
  // Create an object
  docArray.push(await createObj(`${i}`));

  const doc2update = await MyModel.findById(docArray[i]._id);
  // Save the original created date
  const org = doc2update.createdAt;

  // Do the update
  doc2update.createdAt = times[i];
  doc2update.save(); // tried doc2update.update() without change

  // Retrieve the updated object
  docArray[i] = await TaskModel.findById(docArray[i]._id);

  // Check if change preserved
  console.log(docArray[i].createdAt - org,
              'vs expected',
              doc2update.createdAt - org);
}

输出相当令人失望

0 'vs expected' 14841
0 'vs expected' 31809
0 'vs expected' 1232787
0 'vs expected' 121762

我猜这种方式创建的操作不建议常规使用,但在测试时会很方便。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您可以manipulate timestamp in mongoose,就像文档中的任何其他值一样。

您的测试失败,因为.save()是异步功能,您应该等待它完成。

await doc2update.save();