官方原版:http://mongoosejs.com
引用请注明出处和转载请注明出处

Documents

Mongoose documents和数据库中存储的document一一对应。每一个document都是它的Model的实例。

检索

Mongoose提供了丰富的方法,从MongoDB中检索document,详情请查看[querying][]章节。

更新

有很多的方法可以更新documents,我们首先了解传统的方法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);
    });
});

上面的方法首先从mongo中检索文档,然后发出修改命令(调用save触发)。如果我们的应用程序不需要返回document,只想直接修改数据库中的document,Model#update更适合我们:

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

如果我们的应用程序想要返回document,我们最好使用下面的方法会:

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

findAndUpdate/Remove静态方法最多只修改一个document,可以只调用一次就完成数据库中数据的修改,findAndModify`主体有多种不同的使用方法,详情查看API文档。

请注意findAndUpdate/Remove修改documents之前并不会执行任何的hooks或者validation。你可以在该函数的option参数中设置runValidators属性为true开启本次更新的documents子集的验证。然而,如果你需要hooks和全部document validation,首先需要查询document,然后再save()它们。

验证

关于Documents保存之前的验证,详情请查看API文档或者validation章节。

重写

你可以通过.set()方法重写document。该方法修改数据库中保存的文档非常的方便。

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

下一章 —— Subdocuments