修改記錄的方法
靜態(tài)方法:
- update
- findOneAndUpdate
- findByIdAndUpdate
實例方法:
- update
- set and save
實例方法set and save
在test文件創(chuàng)建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);
});
});
再改變實例以后,要再次存進(jìn)數(shù)據(jù)庫:
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();
});
});
使用這個方法構(gòu)造的好處是,我們可以先修改實例的屬性,然后再存進(jìn)數(shù)據(jù)庫,當(dāng)我們需要修改很多個屬性時,只要與數(shù)據(jù)庫touch一次。
實例方法update
可以直接使用update函數(shù)來對數(shù)據(jù)庫記錄進(jìn)行更新:
joe.update({name: 'Alex'});
斷言函數(shù):
當(dāng)我們需要返回多個回調(diào)并且有多個斷言時,可以寫一個斷言函數(shù)來減少代碼量:
function assertName(operation, done){ //js的函數(shù)作用域
operation //作為參數(shù)的函數(shù),讓它在斷言函數(shù)里返回promise
.then(() => User.find({}))
.then((users) => {
assert(users.length === 1);
assert(users[0].name === 'Alex');
done();
});
}
然后直接把函數(shù)作為參數(shù)使用:
assertName(joe.update({name: 'Alex'}), done);
所以it function變成:
it('A model instance can update', (done) => {
assertName(joe.update({name: 'Alex'}), done);
});
靜態(tài)方法update
update(查找條件,更新內(nèi)容):
it('A model class can update', (done) => {
assertName(User.update({name: 'Joe'}, {name: 'Alex'}), done);
});
靜態(tài)方法findOneAndUpdate
findOneAndUpdate(查找條件,更新內(nèi)容):
it('A model class can update one record', (done) => {
assertName(User.findOneAndUpdate({name: 'Joe'}, {name: 'Alex'}), done);
});
靜態(tài)方法findByIdAndUpdate
findByIdAndUpdate(_id,更新內(nèi)容):
it('A model class can find a with an Id and update', (done) => {
assertName(User.findByIdAndUpdate(joe._id, {name: 'Alex'}), done);
});