文档 (Documents)

优质
小牛编辑
131浏览
2023-12-01

Mongoose document 代表着 MongoDB 文档的一对一映射。 每个 document 都是他的 Model 的实例。

检索

MongoDB 有很多检索数据的方法。我们在这章暂不提及,详情请看 querying。

更新

Document 更新的方法同样有很多,我们先看看一个传统的实现,使用 findById:

Tank.findById(id, function (err, tank) {
  if (err) return handleError(err);

  tank.size = 'large';
  tank.save(function (err, updatedTank) {
    if (err) return handleError(err);
    res.send(updatedTank);
  });
});

你也可以用 .set() 修改 document。在底层, tank.size = 'large';tank.set({ size: 'large' })实现。

Tank.findById(id, function (err, tank) {
  if (err) return handleError(err);

  tank.set({ size: 'large' });
  tank.save(function (err, updatedTank) {
    if (err) return handleError(err);
    res.send(updatedTank);
  });
});

这个方法先检索数据,接着更新(使用了 save)。 如果我们仅仅需要更新而不需要获取该数据, Model#update 就很适合我们:

Tank.update({ _id: id }, { $set: { size: 'large' }}, callback);

如果我们确实需要返回文档,这个方法更适合:

Tank.findByIdAndUpdate(id, { $set: { size: 'large' }}, { new: true }, function (err, tank) {
  if (err) return handleError(err);
  res.send(tank);
});

findAndUpdate/Remove 系列静态方法查找并返回最多1个文档。 模式的方法有不少,请阅读 API 文档了解更多。

注意:findAndUpdate/Remove 不会 修改数据库时执行任何钩子或验证。 你可以使用 runValidators 选项 获取一个验证的限制子集(待修改)。 但是你需要钩子和全文档验证,还是先 query 后 save 吧。

验证

Document 会在被保存之前验证。阅读 api 文档或 validation 章节了解更多。

覆盖

你可以用 .set() 覆盖整个文档。如果你要修改 在中间件中被保存的文档,这样就很方便。

Tank.findById(id, function (err, tank) {
  if (err) return handleError(err);
  // Now `otherTank` is a copy of `tank`
  otherTank.set(tank);
});

下一步

现在我们介绍了 Documents,接着看看 Subdocuments。