預設值
在您的結構描述中宣告預設值
您的結構描述可以為某些路徑定義預設值。如果您建立一個新的文件,且該路徑未設定,則會啟用預設值。
注意:只有在路徑的值嚴格為 undefined
時,Mongoose 才會應用預設值。
const schema = new Schema({
name: String,
role: { type: String, default: 'guitarist' }
});
const Person = db.model('Person', schema);
const axl = new Person({ name: 'Axl Rose', role: 'singer' });
assert.equal(axl.role, 'singer');
const slash = new Person({ name: 'Slash' });
assert.equal(slash.role, 'guitarist');
const izzy = new Person({ name: 'Izzy', role: undefined });
assert.equal(izzy.role, 'guitarist');
// Defaults do **not** run on `null`, `''`, or value other than `undefined`.
const foo = new Person({ name: 'Bar', role: null });
assert.strictEqual(foo.role, null);
await Person.create(axl, slash);
const docs = await Person.find({ role: 'guitarist' });
assert.equal(docs.length, 1);
assert.equal(docs[0].name, 'Slash');
預設函式
您也可以將 default
結構描述選項設定為函式。Mongoose 將執行該函式,並使用傳回值作為預設值。
const schema = new Schema({
title: String,
date: {
type: Date,
// `Date.now()` returns the current unix timestamp as a number
default: Date.now
}
});
const BlogPost = db.model('BlogPost', schema);
const post = new BlogPost({ title: '5 Best Arnold Schwarzenegger Movies' });
// The post has a default Date set to now
assert.ok(post.date.getTime() >= Date.now() - 1000);
assert.ok(post.date.getTime() <= Date.now());
setDefaultsOnInsert
選項
當 upsert
選項設定時,Mongoose 還會在 update()
和 findOneAndUpdate()
上設定預設值,方法是將您結構描述的預設值新增至 MongoDB $setOnInsert
運算子。您可以將 setDefaultsOnInsert
選項設定為 false
來停用此行為。
const schema = new Schema({
title: String,
genre: { type: String, default: 'Action' }
});
const Movie = db.model('Movie', schema);
const query = {};
const update = { title: 'The Terminator' };
const options = {
// Return the document after updates are applied
new: true,
// Create a document if one isn't found.
upsert: true
};
let doc = await Movie.findOneAndUpdate(query, update, options).lean();
doc.genre; // 'Action', Mongoose set a default value.
await Movie.deleteMany({});
doc = await Movie.findOneAndUpdate(query, update, { new: true, upsert: true, setDefaultsOnInsert: false }).lean();
doc.genre; // undefined, Mongoose did not set a default value
您也可以全域設定 setDefaultsOnInsert
為 false
mongoose.set('setDefaultsOnInsert', false);
預設函式和 this
除非它在帶有 setDefaultsOnInsert
的查詢上執行,否則預設函式的 this
會參照文件。
const schema = new Schema({
title: String,
released: Boolean,
releaseDate: {
type: Date,
default: function() {
if (this.released) {
return Date.now();
}
return null;
}
}
});
const Movie = db.model('Movie', schema);
const movie1 = new Movie({ title: 'The Terminator', released: true });
// The post has a default Date set to now
assert.ok(movie1.releaseDate.getTime() >= Date.now() - 1000);
assert.ok(movie1.releaseDate.getTime() <= Date.now());
const movie2 = new Movie({ title: 'The Legend of Conan', released: false });
// Since `released` is false, the default function will return null
assert.strictEqual(movie2.releaseDate, null);