修改记录的方法
静态方法:
- update
- findOneAndUpdate
- findByIdAndUpdate
实例方法:
- update
- set and save
实例方法set and save
在test文件创建update_test.js:
const assert = require('assert');
const User = require('../src/user');
describe('Updating records', () => {
let joe;
beforeEach((done) => {
joe = new User({name : 'Joe'});
joe.save()
.then(() => done());
});
it('instance type using set and save', () => {
console.log(joe);
joe.set('name', 'Alex');
console.log(joe);
});
});
再改变实例以后,要再次存进数据库:
it('instance type using set and save', (done) => {
joe.set('name', 'Alex');
joe.save()
.then(() => User.find({}))
.then((users) => {
assert(users.length === 1);
assert(users[0].name === 'Alex');
done();
});
});
使用这个方法构造的好处是,我们可以先修改实例的属性,然后再存进数据库,当我们需要修改很多个属性时,只要与数据库touch一次。
实例方法update
可以直接使用update函数来对数据库记录进行更新:
joe.update({name: 'Alex'});
断言函数:
当我们需要返回多个回调并且有多个断言时,可以写一个断言函数来减少代码量:
function assertName(operation, done){ //js的函数作用域
operation //作为参数的函数,让它在断言函数里返回promise
.then(() => User.find({}))
.then((users) => {
assert(users.length === 1);
assert(users[0].name === 'Alex');
done();
});
}
然后直接把函数作为参数使用:
assertName(joe.update({name: 'Alex'}), done);
所以it function变成:
it('A model instance can update', (done) => {
assertName(joe.update({name: 'Alex'}), done);
});
静态方法update
update(查找条件,更新内容):
it('A model class can update', (done) => {
assertName(User.update({name: 'Joe'}, {name: 'Alex'}), done);
});
静态方法findOneAndUpdate
findOneAndUpdate(查找条件,更新内容):
it('A model class can update one record', (done) => {
assertName(User.findOneAndUpdate({name: 'Joe'}, {name: 'Alex'}), done);
});
静态方法findByIdAndUpdate
findByIdAndUpdate(_id,更新内容):
it('A model class can find a with an Id and update', (done) => {
assertName(User.findByIdAndUpdate(joe._id, {name: 'Alex'}), done);
});