Documents
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。