模型 (Model)
Model()
Model.$where()
Model.aggregate()
Model.applyDefaults()
Model.applyVirtuals()
Model.bulkSave()
Model.bulkWrite()
Model.castObject()
Model.cleanIndexes()
Model.countDocuments()
Model.create()
Model.createCollection()
Model.createIndexes()
Model.createSearchIndex()
Model.db
Model.deleteMany()
Model.deleteOne()
Model.diffIndexes()
Model.discriminator()
Model.distinct()
Model.dropSearchIndex()
Model.ensureIndexes()
Model.estimatedDocumentCount()
Model.events
Model.exists()
Model.find()
Model.findById()
Model.findByIdAndDelete()
Model.findByIdAndUpdate()
Model.findOne()
Model.findOneAndDelete()
Model.findOneAndReplace()
Model.findOneAndUpdate()
Model.hydrate()
Model.init()
Model.insertMany()
Model.inspect()
Model.listIndexes()
Model.listSearchIndexes()
Model.populate()
Model.prototype.$model()
Model.prototype.$where
Model.prototype.base
Model.prototype.baseModelName
Model.prototype.collection
Model.prototype.collection
Model.prototype.db
Model.prototype.deleteOne()
Model.prototype.discriminators
Model.prototype.increment()
Model.prototype.model()
Model.prototype.modelName
Model.prototype.save()
Model.recompileSchema()
Model.replaceOne()
Model.schema
Model.startSession()
Model.syncIndexes()
Model.translateAliases()
Model.updateMany()
Model.updateOne()
Model.updateSearchIndex()
Model.validate()
Model.watch()
Model.where()
Model()
參數
doc
«Object» 初始設定的值[fields]
«Object» 選擇性物件,包含傳回此文件的查詢中所選取的欄位。您不需要設定此參數來確保 Mongoose 處理您的查詢投影。[skipId=false]
«Boolean» 選擇性布林值。如果為 true,則 mongoose 不會將_id
欄位新增至文件。
繼承
模型是一個類別,是您與 MongoDB 互動的主要工具。模型的實例稱為 文件。
在 Mongoose 中,「模型」一詞指的是 mongoose.Model
類別的子類別。您不應直接使用 mongoose.Model
類別。如下所示,mongoose.model()
和 connection.model()
函數會建立 mongoose.Model
的子類別。
範例
// `UserModel` is a "Model", a subclass of `mongoose.Model`.
const UserModel = mongoose.model('User', new Schema({ name: String }));
// You can use a Model to create new documents using `new`:
const userDoc = new UserModel({ name: 'Foo' });
await userDoc.save();
// You also use a model to create queries:
const userFromDb = await UserModel.findOne({ name: 'Foo' });
Model.$where()
參數
argument
«String|Function» 是 javascript 字串或匿名函數
傳回
- «Query»
參見
建立一個 Query
並指定一個 $where
條件。
有時您需要使用 JavaScript 表達式在 mongodb 中查詢內容。您可以使用 find({ $where: javascript })
執行此操作,或者您可以使用 mongoose 捷徑方法 $where 通過 Query 鏈或從您的 mongoose 模型中執行。
Blog.$where('this.username.indexOf("val") !== -1').exec(function (err, docs) {});
Model.aggregate()
參數
[pipeline]
«Array» 聚合管線,以物件陣列形式呈現[options]
«Object» 聚合選項
傳回
- «Aggregate»
參見
對模型的集合執行聚合。
如果傳遞了 callback
,則會執行 aggregate
並傳回 Promise
。如果未傳遞回呼,則會傳回 aggregate
本身。
此函數會觸發以下中介軟體。
aggregate()
範例
// Find the max balance of all accounts
const res = await Users.aggregate([
{ $group: { _id: null, maxBalance: { $max: '$balance' }}},
{ $project: { _id: 0, maxBalance: 1 }}
]);
console.log(res); // [ { maxBalance: 98000 } ]
// Or use the aggregation pipeline builder.
const res = await Users.aggregate().
group({ _id: null, maxBalance: { $max: '$balance' } }).
project('-id maxBalance').
exec();
console.log(res); // [ { maxBalance: 98 } ]
注意
- Mongoose 不會將聚合管線轉換為模型的綱要,因為
$project
和$group
運算子允許在管線的任何階段重新定義文件的「形狀」,這可能會使文件處於不相容的格式。您可以使用mongoose-cast-aggregation 外掛程式為聚合管線啟用最小轉換。 - 傳回的文件是普通的 javascript 物件,而不是 mongoose 文件(因為可以傳回任何形狀的文件)。
更多關於聚合的資訊
Model.applyDefaults()
參數
obj
«Object|Document» 要套用預設值的物件或文件
將預設值套用至給定的文件或 POJO。
Model.applyVirtuals()
參數
obj
«Object» 要套用虛擬欄位的物件或文件[virtualsToApply]
«Array<string>» 要套用之虛擬欄位的選擇性白名單
將此模型的虛擬欄位套用至給定的 POJO。虛擬欄位會以 POJO 作為上下文 this
執行。
範例
const userSchema = new Schema({ name: String });
userSchema.virtual('upper').get(function() { return this.name.toUpperCase(); });
const User = mongoose.model('User', userSchema);
const obj = { name: 'John' };
User.applyVirtuals(obj);
obj.name; // 'John'
obj.upper; // 'JOHN', Mongoose applied the return value of the virtual to the given object
Model.bulkSave()
參數
documents
«Array<Document>»[options]
«Object» 傳遞至底層bulkWrite()
的選項[options.timestamps]
«Boolean» 預設值為null
,當設定為 false 時,mongoose 不會新增/更新文件上的時間戳記。[options.session=null]
«ClientSession» 與此大量寫入相關聯的工作階段。請參閱交易文件。[options.wtimeout=null]
«number» 寫入關注逾時。[options.j=true]
«Boolean» 如果為 false,則停用日誌確認
傳回
- «BulkWriteResult» 來自
bulkWrite()
的傳回值
取得文件陣列、取得變更,並根據文件是否為新文件,或是否已變更,在資料庫中插入/更新文件。
bulkSave
在底層使用 bulkWrite
,因此在處理大量文件 (10K+) 時最有用
bulkSave()
在以下情況下擲回錯誤
- 其中一個提供的文件未通過驗證。在這種情況下,
bulkSave()
不會傳送bulkWrite()
,而是擲回第一個驗證錯誤。 bulkWrite()
失敗(例如,由於無法連線到 MongoDB 或由於重複的鍵錯誤)bulkWrite()
沒有插入或更新任何文件。在這種情況下,bulkSave()
將擲回 DocumentNotFound 錯誤。
請注意,如果只有部分 save()
呼叫成功,則 bulkSave()
不會擲回錯誤。
Model.bulkWrite()
參數
ops
«Array»[ops.insertOne.document]
«Object» 要插入的文件[ops.insertOne.timestamps=true]
«Object» 如果為 false,則不會將時間戳記套用至操作[ops.updateOne.filter]
«Object» 更新符合此篩選器的第一個文件[ops.updateOne.update]
«Object» 包含更新運算子的物件[ops.updateOne.upsert=false]
«Boolean» 如果為 true,則在沒有符合的文件時插入文件[ops.updateOne.timestamps=true]
«Boolean» 如果為 false,則不會將時間戳記套用至操作[ops.updateOne.collation]
«Object» 要使用的 MongoDB 校對[ops.updateOne.arrayFilters]
«Array» 在update
中使用的陣列篩選器[ops.updateMany.filter]
«Object» 更新符合此篩選器的所有文件[ops.updateMany.update]
«Object» 包含更新運算子的物件[ops.updateMany.upsert=false]
«Boolean» 如果為 true,則在沒有文件符合filter
時插入文件[ops.updateMany.timestamps=true]
«Boolean» 如果為 false,則不會將時間戳記套用至操作[ops.updateMany.collation]
«Object» 要使用的 MongoDB 校對[ops.updateMany.arrayFilters]
«Array» 在update
中使用的陣列篩選器[ops.deleteOne.filter]
«Object» 刪除符合此篩選器的第一個文件[ops.deleteMany.filter]
«Object» 刪除符合此篩選器的所有文件[ops.replaceOne.filter]
«Object» 取代符合此篩選器的第一個文件[ops.replaceOne.replacement]
«Object» 取代文件[ops.replaceOne.upsert=false]
«Boolean» 如果為 true,則在沒有文件符合filter
時插入文件[ops.replaceOne.timestamps=true]
«Object» 如果為 false,則不會將時間戳記套用至操作[options]
«Object»[options.ordered=true]
«Boolean» 如果為 true,則依序執行寫入,並在第一個錯誤時停止。如果為 false,則並行執行寫入,並繼續執行,直到所有寫入都成功或出現錯誤。[options.timestamps=true]
«Boolean» 如果為 false,則不會將時間戳記套用至任何操作。可以在操作層級覆寫。[options.session=null]
«ClientSession» 與此大量寫入相關聯的工作階段。請參閱交易文件。[options.wtimeout=null]
«number» 寫入關注逾時。[options.j=true]
«Boolean» 如果為 false,則停用日誌確認[options.skipValidation=false]
«Boolean» 設定為 true 以跳過大量寫入操作的 Mongoose 綱要驗證。Mongoose 目前預設會對insertOne
和replaceOne
操作執行驗證。[options.bypassDocumentValidation=false]
«Boolean» 如果為 true,則對此大量寫入中的所有寫入停用 MongoDB 伺服器端綱要驗證。[options.throwOnValidationError=false]
«Boolean» 如果為 true 且ordered: false
,如果其中一個操作未通過驗證,但所有有效操作都成功完成,則擲回錯誤。請注意,Mongoose 仍然會將所有有效操作傳送到 MongoDB 伺服器。[options.strict=null]
«Boolean|[object Object]» 覆寫綱要上的strict
選項。如果為 false,則允許篩選和寫入未在綱要中定義的欄位,適用於此大量寫入中的所有寫入。
傳回
- «Promise» 如果操作成功,會解析為
BulkWriteOpResult
在一個指令中向 MongoDB 伺服器發送多個 insertOne
、updateOne
、updateMany
、replaceOne
、deleteOne
和/或 deleteMany
操作。這比發送多個獨立操作(例如,如果您使用 create()
)更快,因為使用 bulkWrite()
只會與 MongoDB 進行一次往返。
Mongoose 會對您提供的所有操作執行類型轉換。唯一的例外是將 updateOne
或 updateMany
的 update
運算子設定為管道:Mongoose 不會轉換更新管道。
此函數不會觸發任何中介軟體,包括 save()
和 update()
。如果您需要為每個文件觸發 save()
中介軟體,請改用 create()
。
範例
Character.bulkWrite([
{
insertOne: {
document: {
name: 'Eddard Stark',
title: 'Warden of the North'
}
}
},
{
updateOne: {
filter: { name: 'Eddard Stark' },
// If you were using the MongoDB driver directly, you'd need to do
// `update: { $set: { title: ... } }` but mongoose adds $set for
// you.
update: { title: 'Hand of the King' }
}
},
{
deleteOne: {
filter: { name: 'Eddard Stark' }
}
}
]).then(res => {
// Prints "1 1 1"
console.log(res.insertedCount, res.modifiedCount, res.deletedCount);
});
// Mongoose does **not** cast update pipelines, so no casting for the `update` option below.
// Mongoose does still cast `filter`
await Character.bulkWrite([{
updateOne: {
filter: { name: 'Annika Hansen' },
update: [{ $set: { name: 7 } }] // Array means update pipeline, so Mongoose skips casting
}
}]);
支援的操作包括
insertOne
updateOne
updateMany
deleteOne
deleteMany
replaceOne
Model.castObject()
參數
obj
«Object» 要轉換的物件或文件options
«Object» 傳遞給 castObject 的選項options.ignoreCastErrors
«Boolean» 如果設定為true
,則不會拋出 ValidationError,只會傳回成功轉換的值。
將給定的 POJO 轉換為模型的綱要
範例
const Test = mongoose.model('Test', Schema({ num: Number }));
const obj = Test.castObject({ num: '42' });
obj.num; // 42 as a number
Test.castObject({ num: 'not a number' }); // Throws a ValidationError
Model.cleanIndexes()
參數
[callback]
«Function» 可選的回呼函數
傳回
- «Promise,undefined,void» 如果指定回呼函數則傳回
undefined
,如果沒有回呼函數則傳回 Promise。
刪除此模型綱要中未定義的所有索引。由 syncIndexes()
使用。
傳回的 Promise 會解析為已刪除索引名稱的列表,以陣列形式呈現
Model.countDocuments()
參數
filter
«Object»
傳回
- «Query»
計算資料庫集合中符合 filter
的文件數量。
範例
Adventure.countDocuments({ type: 'jungle' }, function (err, count) {
console.log('there are %d jungle adventures', count);
});
如果您想計算大型集合中的所有文件,請改用 estimatedDocumentCount()
函數。如果您呼叫 countDocuments({})
,MongoDB 將始終執行完整的集合掃描,而不會使用任何索引。
countDocuments()
函數與 count()
類似,但有一些 countDocuments()
不支援的運算子。以下是 count()
支援但 countDocuments()
不支援的運算子,以及建議的替換方式
$where
:$expr
$near
:$geoWithin
與$center
$nearSphere
:$geoWithin
與$centerSphere
Model.create()
參數
docs
«Array|Object» 要插入的文件,以展開或陣列形式[options]
«Object» 傳遞給save()
的選項。若要指定options
,docs
必須是陣列,而不是展開。請參閱 Model.save 以取得可用選項。[options.ordered]
«Boolean» 依序而非平行儲存文件。[options.aggregateErrors]
«Boolean» 彙總錯誤,而不是拋出發生的第一個錯誤。預設值:false
傳回
- «Promise»
將一個或多個文件儲存到資料庫的快捷方式。MyModel.create(docs)
會對 docs 中的每個文件執行 new MyModel(doc).save()
。
此函數會觸發以下中介軟體。
save()
範例
// Insert one new `Character` document
await Character.create({ name: 'Jean-Luc Picard' });
// Insert multiple new `Character` documents
await Character.create([{ name: 'Will Riker' }, { name: 'Geordi LaForge' }]);
// Create a new character within a transaction. Note that you **must**
// pass an array as the first parameter to `create()` if you want to
// specify options.
await Character.create([{ name: 'Jean-Luc Picard' }], { session });
Model.createCollection()
參數
[options]
«Object» 請參閱 MongoDB 驅動程式文件
為此模型建立集合。預設情況下,如果未指定任何索引,mongoose 將不會為模型建立集合,直到建立任何文件。使用此方法明確建立集合。
注意 1:您可能需要在啟動交易之前呼叫此方法。請參閱 https://www.mongodb.com/docs/manual/core/transactions/#transactions-and-operations
注意 2:如果您的綱要包含索引或唯一欄位,則不必呼叫此方法。在這種情況下,只需使用 Model.init()
即可
範例
const userSchema = new Schema({ name: String })
const User = mongoose.model('User', userSchema);
User.createCollection().then(function(collection) {
console.log('Collection is created!');
});
Model.createIndexes()
參數
[options]
«Object» 內部選項
傳回
- «Promise»
與 ensureIndexes()
類似,除了它使用 createIndex
函數。
Model.createSearchIndex()
參數
description
«Object» 索引選項,包括name
和definition
description.name
«String»description.definition
«Object»
傳回
- «Promise»
建立 Atlas 搜尋索引。此函數僅在連線到 MongoDB Atlas 時有效。
範例
const schema = new Schema({ name: { type: String, unique: true } });
const Customer = mongoose.model('Customer', schema);
await Customer.createSearchIndex({ name: 'test', definition: { mappings: { dynamic: true } } });
Model.db
類型
- «property»
模型使用的連線實例。
Model.deleteMany()
參數
conditions
«Object»[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。
傳回
- «Query»
從集合中刪除符合 conditions
的所有文件。它會傳回一個具有 deletedCount
屬性的物件,其中包含已刪除的文件數量。行為類似於 remove()
,但無論 single
選項如何,都會刪除所有符合 conditions
的文件。
範例
await Character.deleteMany({ name: /Stark/, age: { $gte: 18 } }); // returns {deletedCount: x} where x is the number of documents deleted.
注意
此函數會觸發 deleteMany
查詢掛鉤。請閱讀 中介軟體文件以瞭解更多資訊。
Model.deleteOne()
參數
conditions
«Object»[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。
傳回
- «Query»
從集合中刪除第一個符合 conditions
的文件。它會傳回一個具有 deletedCount
屬性的物件,指示已刪除的文件數量。行為類似於 remove()
,但無論 single
選項如何,最多刪除一個文件。
範例
await Character.deleteOne({ name: 'Eddard Stark' }); // returns {deletedCount: 1}
注意
此函數會觸發 deleteOne
查詢掛鉤。請閱讀 中介軟體文件以瞭解更多資訊。
Model.diffIndexes()
參數
[options]
«Object»
傳回
- «Promise<Object>» 包含將在 MongoDB 中刪除的索引,以及將在 MongoDB 中建立的索引,格式為
{ toDrop: string[], toCreate: string[] }
。
執行 Model.syncIndexes()
的試運行,傳回如果您要執行 syncIndexes()
,則 syncIndexes()
將會刪除和建立的索引。
範例
const { toDrop, toCreate } = await Model.diffIndexes();
toDrop; // Array of strings containing names of indexes that `syncIndexes()` will drop
toCreate; // Array of strings containing names of indexes that `syncIndexes()` will create
Model.discriminator()
參數
name
«String» 辨別器模型名稱schema
«Schema» 辨別器模型綱要[options]
«Object|String» 如果是字串,則與options.value
相同。[options.value]
«String» 儲存在discriminatorKey
屬性中的字串。如果未指定,Mongoose 會使用name
參數。[options.clone=true]
«Boolean» 預設情況下,discriminator()
會複製給定的schema
。設定為false
可略過複製。[options.overwriteModels=false]
«Boolean» 預設情況下,Mongoose 不允許您定義與另一個辨別器同名的辨別器。設定此選項可允許覆寫同名的辨別器。[options.mergeHooks=true]
«Boolean» 預設情況下,Mongoose 會將基本綱要的掛鉤與辨別器綱要的掛鉤合併。將此選項設定為false
,使 Mongoose 改為使用辨別器綱要的掛鉤。[options.mergePlugins=true]
«Boolean» 預設情況下,Mongoose 會將基本綱要的外掛程式與辨別器綱要的外掛程式合併。將此選項設定為false
,使 Mongoose 改為使用辨別器綱要的外掛程式。
傳回
- «Model» 新建立的辨別器模型
新增辨別器類型。
範例
function BaseSchema() {
Schema.apply(this, arguments);
this.add({
name: String,
createdAt: Date
});
}
util.inherits(BaseSchema, Schema);
const PersonSchema = new BaseSchema();
const BossSchema = new BaseSchema({ department: String });
const Person = mongoose.model('Person', PersonSchema);
const Boss = Person.discriminator('Boss', BossSchema);
new Boss().__t; // "Boss". `__t` is the default `discriminatorKey`
const employeeSchema = new Schema({ boss: ObjectId });
const Employee = Person.discriminator('Employee', employeeSchema, 'staff');
new Employee().__t; // "staff" because of 3rd argument above
Model.distinct()
參數
field
«String»[conditions]
«Object» 可選[options]
«Object» 可選
傳回
- «Query»
Model.dropSearchIndex()
參數
name
«String»
傳回
- «Promise»
依名稱刪除現有的 Atlas 搜尋索引。此函數僅在連線到 MongoDB Atlas 時有效。
範例
const schema = new Schema({ name: { type: String, unique: true } });
const Customer = mongoose.model('Customer', schema);
await Customer.dropSearchIndex('test');
Model.ensureIndexes()
參數
[options]
«Object» 內部選項
傳回
- «Promise»
針對綱要中宣告的每個索引,向 mongo 發送 createIndex
指令。createIndex
指令依序發送。
範例
await Event.ensureIndexes();
完成後,此 Model
會發出 index
事件,如果發生錯誤,則會傳遞錯誤。
範例
const eventSchema = new Schema({ thing: { type: 'string', unique: true } })
const Event = mongoose.model('Event', eventSchema);
Event.on('index', function (err) {
if (err) console.error(err); // error occurred during index creation
});
注意:不建議您在生產環境中執行此操作。索引建立可能會影響資料庫效能,具體取決於您的負載。請謹慎使用。
Model.estimatedDocumentCount()
參數
[options]
«Object»
傳回
- «Query»
估計 MongoDB 集合中的文件數量。對於大型集合,使用 estimatedDocumentCount()
比使用 countDocuments()
快,因為 estimatedDocumentCount()
使用集合中繼資料,而不是掃描整個集合。
範例
const numAdventures = await Adventure.estimatedDocumentCount();
Model.events
類型
- «property»
報告發生的任何錯誤的事件發射器。適用於全域錯誤處理。
範例
MyModel.events.on('error', err => console.log(err.message));
// Prints a 'CastError' because of the above handler
await MyModel.findOne({ _id: 'Not a valid ObjectId' }).catch(noop);
Model.exists()
參數
filter
«Object»[options]
«Object» 可選,請參閱Query.prototype.setOptions()
傳回
- «Query»
如果資料庫中至少存在一個符合給定 filter
的文件,則僅傳回具有 _id
的文件,否則傳回 null
。
在底層,MyModel.exists({ answer: 42 })
等效於 MyModel.findOne({ answer: 42 }).select({ _id: 1 }).lean()
範例
await Character.deleteMany({});
await Character.create({ name: 'Jean-Luc Picard' });
await Character.exists({ name: /picard/i }); // { _id: ... }
await Character.exists({ name: /riker/i }); // null
此函數會觸發以下中介軟體。
findOne()
Model.find()
參數
filter
«Object|ObjectId»[projection]
«Object|String|Array[String]» 可選的傳回欄位,請參閱Query.prototype.select()
[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。
傳回
- «Query»
參見
尋找文件。
Mongoose 會在傳送指令之前轉換 filter
以符合模型的綱要。請參閱我們的查詢轉換教學,以瞭解有關 Mongoose 如何轉換 filter
的更多資訊。
範例
// find all documents
await MyModel.find({});
// find all documents named john and at least 18
await MyModel.find({ name: 'john', age: { $gte: 18 } }).exec();
// executes, name LIKE john and only selecting the "name" and "friends" fields
await MyModel.find({ name: /john/i }, 'name friends').exec();
// passing options
await MyModel.find({ name: /john/i }, null, { skip: 10 }).exec();
Model.findById()
參數
id
«Any» 要查詢的_id
值[projection]
«Object|String|Array[String]» 可選的傳回欄位,請參閱Query.prototype.select()
[options]
«Object» 可選,請參閱Query.prototype.setOptions()
傳回
- «Query»
參見
依其 _id 欄位尋找單一文件。findById(id)
幾乎*等效於 findOne({ _id: id })
。如果您要依文件的 _id
查詢,請使用 findById()
而不是 findOne()
。
id
會根據綱要在傳送指令之前進行轉換。
此函數會觸發以下中介軟體。
findOne()
* 除了它處理 undefined
的方式之外。如果您使用 findOne()
,您會發現 findOne(undefined)
和 findOne({ _id: undefined })
等效於 findOne({})
並傳回任意文件。但是,mongoose 會將 findById(undefined)
轉換為 findOne({ _id: null })
。
範例
// Find the adventure with the given `id`, or `null` if not found
await Adventure.findById(id).exec();
// select only the adventures name and length
await Adventure.findById(id, 'name length').exec();
Model.findByIdAndDelete()
參數
id
«Object|Number|String» 要查詢的_id
值[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.strict]
«Boolean|String» 覆寫綱要的 strict 模式選項[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。
傳回
- «Query»
參見
依文件的 _id 欄位發出 MongoDB findOneAndDelete()
指令。換句話說,findByIdAndDelete(id)
是 findOneAndDelete({ _id: id })
的簡寫。
此函數會觸發以下中介軟體。
findOneAndDelete()
Model.findByIdAndUpdate()
參數
id
«Object|Number|String» 要查詢的_id
值[update]
«Object»[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.returnDocument='before']
«String» 有兩個可能的值,'before'
和'after'
。預設情況下,它會返回更新應用之前的文檔。[options.lean]
«Object» 如果為真值,Mongoose 將返回一個純 JavaScript 物件,而不是 Mongoose 文檔。請參閱Query.lean()
和 Mongoose lean 教學。[options.session=null]
«ClientSession» 與此查詢關聯的會話。請參閱交易文檔。[options.strict]
«Boolean|String» 覆寫綱要的 strict 模式選項[options.timestamps=null]
«Boolean» 如果設定為false
且啟用schema 層級時間戳,則跳過此更新的時間戳。請注意,這允許您覆寫時間戳。如果未設定 schema 層級時間戳,則不會執行任何操作。[options.sort]
«Object|String» 如果條件找到多個文檔,則設定排序順序以選擇要更新的文檔。[options.runValidators]
«Boolean» 如果為 true,則在此命令上執行更新驗證器。更新驗證器會根據模型的 schema 驗證更新操作。[options.setDefaultsOnInsert=true]
«Boolean» 如果setDefaultsOnInsert
和upsert
為 true,如果建立新文檔,Mongoose 將套用模型 schema 中指定的預設值。[options.includeResultMetadata]
«Boolean» 如果為 true,則返回來自 MongoDB 驅動程式的完整 ModifyResult,而不僅僅是文檔。[options.upsert=false]
«Boolean» 如果為 true,且未找到任何文檔,則插入新文檔。[options.new=false]
«Boolean» 如果為 true,則返回修改後的文檔,而不是原始文檔。[options.select]
«Object|String» 設定要返回的文檔欄位。[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。[options.overwriteDiscriminatorKey=false]
«Boolean» Mongoose 預設會從update
中移除鑑別器鍵更新,將overwriteDiscriminatorKey
設定為true
以允許更新鑑別器鍵。
傳回
- «Query»
參見
透過文檔的 _id 欄位發出 mongodb findOneAndUpdate 命令。findByIdAndUpdate(id, ...)
等效於 findOneAndUpdate({ _id: id }, ...)
。
找到符合的文檔,根據 update
參數更新它,傳遞任何 options
,並返回找到的文檔(如果有)。
此函數會觸發以下中介軟體。
findOneAndUpdate()
範例
A.findByIdAndUpdate(id, update, options) // returns Query
A.findByIdAndUpdate(id, update) // returns Query
A.findByIdAndUpdate() // returns Query
注意
所有非 atomic
操作名稱的頂層更新鍵都會被視為設定操作。
範例
Model.findByIdAndUpdate(id, { name: 'jason bourne' }, options)
// is sent as
Model.findByIdAndUpdate(id, { $set: { name: 'jason bourne' }}, options)
注意
findOneAndX
和 findByIdAndX
函數支援有限的驗證。您可以透過設定 runValidators
選項來啟用驗證。
如果您需要完整的驗證,請使用傳統方法,先檢索文檔。
const doc = await Model.findById(id)
doc.name = 'jason bourne';
await doc.save();
Model.findOne()
參數
[conditions]
«Object»[projection]
«Object|String|Array[String]» 可選的傳回欄位,請參閱Query.prototype.select()
[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。
傳回
- «Query»
參見
尋找一個文檔。
在發送命令之前,conditions
會強制轉換為它們各自的 SchemaTypes。
注意:conditions
是可選的,如果 conditions
為 null 或未定義,Mongoose 將向 MongoDB 發送空的 findOne
命令,這將返回任意文檔。如果您要透過 _id
查詢,請改用 findById()
。
範例
// Find one adventure whose `country` is 'Croatia', otherwise `null`
await Adventure.findOne({ country: 'Croatia' }).exec();
// Model.findOne() no longer accepts a callback
// Select only the adventures name and length
await Adventure.findOne({ country: 'Croatia' }, 'name length').exec();
Model.findOneAndDelete()
參數
conditions
«Object»[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.strict]
«Boolean|String» 覆寫綱要的 strict 模式選項[options.projection=null]
«Object|String|Array[String]» 要返回的可選欄位,請參閱Query.prototype.select()
[options.session=null]
«ClientSession» 與此查詢關聯的會話。請參閱交易文檔。[options.includeResultMetadata]
«Boolean» 如果為 true,則返回來自 MongoDB 驅動程式的完整 ModifyResult,而不僅僅是文檔。[options.sort]
«Object|String» 如果條件找到多個文檔,則設定排序順序以選擇要更新的文檔。[options.select]
«Object|String» 設定要返回的文檔欄位。[options.maxTimeMS]
«Number» 為查詢設定時間限制 - 需要 mongodb >= 2.6.0[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。
傳回
- «Query»
發出 MongoDB findOneAndDelete()
命令。
找到符合的文檔,將其移除,並返回找到的文檔(如果有)。
此函數會觸發以下中介軟體。
findOneAndDelete()
範例
A.findOneAndDelete(conditions, options) // return Query
A.findOneAndDelete(conditions) // returns Query
A.findOneAndDelete() // returns Query
findOneAndX
和 findByIdAndX
函數支援有限的驗證。您可以透過設定 runValidators
選項來啟用驗證。
如果您需要完整的驗證,請使用傳統方法,先檢索文檔。
const doc = await Model.findById(id)
doc.name = 'jason bourne';
await doc.save();
Model.findOneAndReplace()
參數
filter
«Object» 替換第一個符合此篩選器的文檔[replacement]
«Object» 使用此文檔替換[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.returnDocument='before']
«String» 有兩個可能的值,'before'
和'after'
。預設情況下,它會返回更新應用之前的文檔。[options.lean]
«Object» 如果為真值,Mongoose 將返回一個純 JavaScript 物件,而不是 Mongoose 文檔。請參閱Query.lean()
和 Mongoose lean 教學。[options.session=null]
«ClientSession» 與此查詢關聯的會話。請參閱交易文檔。[options.strict]
«Boolean|String» 覆寫綱要的 strict 模式選項[options.timestamps=null]
«Boolean» 如果設定為false
且啟用schema 層級時間戳,則跳過此更新的時間戳。請注意,這允許您覆寫時間戳。如果未設定 schema 層級時間戳,則不會執行任何操作。[options.projection=null]
«Object|String|Array[String]» 要返回的可選欄位,請參閱Query.prototype.select()
[options.sort]
«Object|String» 如果條件找到多個文檔,則設定排序順序以選擇要更新的文檔。[options.includeResultMetadata]
«Boolean» 如果為 true,則返回來自 MongoDB 驅動程式的完整 ModifyResult,而不僅僅是文檔。[options.select]
«Object|String» 設定要返回的文檔欄位。[options.maxTimeMS]
«Number» 為查詢設定時間限制 - 需要 mongodb >= 2.6.0[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。
傳回
- «Query»
發出 MongoDB findOneAndReplace()
命令。
找到符合的文檔,將其替換為提供的文檔,並返回該文檔。
此函數會觸發以下查詢中間件。
findOneAndReplace()
範例
A.findOneAndReplace(filter, replacement, options) // return Query
A.findOneAndReplace(filter, replacement) // returns Query
A.findOneAndReplace() // returns Query
Model.findOneAndUpdate()
參數
[conditions]
«Object»[update]
«Object»[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.returnDocument='before']
«String» 有兩個可能的值,'before'
和'after'
。預設情況下,它會返回更新應用之前的文檔。[options.lean]
«Object» 如果為真值,Mongoose 將返回一個純 JavaScript 物件,而不是 Mongoose 文檔。請參閱Query.lean()
和 Mongoose lean 教學。[options.session=null]
«ClientSession» 與此查詢關聯的會話。請參閱交易文檔。[options.strict]
«Boolean|String» 覆寫綱要的 strict 模式選項[options.timestamps=null]
«Boolean» 如果設定為false
且啟用schema 層級時間戳,則跳過此更新的時間戳。請注意,這允許您覆寫時間戳。如果未設定 schema 層級時間戳,則不會執行任何操作。[options.upsert=false]
«Boolean» 如果為 true,且未找到任何文檔,則插入新文檔。[options.projection=null]
«Object|String|Array[String]» 要返回的可選欄位,請參閱Query.prototype.select()
[options.new=false]
«Boolean» 如果為 true,則返回修改後的文檔,而不是原始文檔。[options.fields]
«Object|String» 欄位選擇。等效於.select(fields).findOneAndUpdate()
[options.maxTimeMS]
«Number» 為查詢設定時間限制 - 需要 mongodb >= 2.6.0[options.sort]
«Object|String» 如果條件找到多個文檔,則設定排序順序以選擇要更新的文檔。[options.runValidators]
«Boolean» 如果為 true,則在此命令上執行更新驗證器。更新驗證器會根據模型的 schema 驗證更新操作。[options.setDefaultsOnInsert=true]
«Boolean» 如果setDefaultsOnInsert
和upsert
為 true,如果建立新文檔,Mongoose 將套用模型 schema 中指定的預設值。[options.includeResultMetadata]
«Boolean» 如果為 true,則返回來自 MongoDB 驅動程式的原始結果[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。[options.overwriteDiscriminatorKey=false]
«Boolean» Mongoose 預設會從update
中移除鑑別器鍵更新,將overwriteDiscriminatorKey
設定為true
以允許更新鑑別器鍵。
傳回
- «Query»
參見
發出 mongodb findOneAndUpdate 命令。
找到符合的文檔,根據 update
參數更新它,傳遞任何 options
,並將找到的文檔(如果有)返回給回呼。如果傳遞了 callback
,則執行查詢,否則返回 Query 物件。
範例
A.findOneAndUpdate(conditions, update, options) // returns Query
A.findOneAndUpdate(conditions, update) // returns Query
A.findOneAndUpdate() // returns Query
注意
所有非 atomic
操作名稱的頂層更新鍵都會被視為設定操作。
範例
const query = { name: 'borne' };
Model.findOneAndUpdate(query, { name: 'jason bourne' }, options)
// is sent as
Model.findOneAndUpdate(query, { $set: { name: 'jason bourne' }}, options)
注意
findOneAndX
和 findByIdAndX
函數支援有限的驗證,您可以透過設定 runValidators
選項來啟用驗證。
如果您需要完整的驗證,請使用傳統方法,先檢索文檔。
const doc = await Model.findById(id);
doc.name = 'jason bourne';
await doc.save();
Model.hydrate()
參數
obj
«Object»[projection]
«Object|String|Array[String]» 可選的投影,包含應為此文檔選取的欄位[options]
«Object» 可選的選項[options.setters=false]
«Boolean» 如果為 true,則在水合時套用 schema 設定器。[options.hydratedPopulatedDocs=false]
«Boolean» 如果為 true,則在傳遞預先填充的資料時填充文檔。
傳回
- «Document» 文檔實例
從現有的原始資料建立新文檔的快捷方式,該資料已預先儲存在資料庫中。返回的文檔最初沒有任何路徑標記為已修改。
範例
// hydrate previous data into a Mongoose document
const mongooseCandy = Candy.hydrate({ _id: '54108337212ffb6d459f854c', type: 'jelly bean' });
Model.init()
此函數負責根據 schema 選項初始化 MongoDB 中的基礎連線。此函數會執行下列操作
createCollection()
,除非關閉了autoCreate
選項ensureIndexes()
,除非關閉了autoIndex
選項- 如果啟用了
autoSearchIndex
,則在所有 schema 搜尋索引上執行createSearchIndex()
。
當使用 mongoose.model()
或 connection.model()
建立模型時,Mongoose 會自動呼叫此函數,因此您不需要呼叫 init()
來觸發索引建立。
但是,您可能需要呼叫 init()
來取回一個 promise,該 promise 將在您的索引完成時解析。如果您需要在繼續之前等待索引建立完成,則呼叫 await Model.init()
會很有幫助。例如,如果您想在繼續測試案例之前等待唯一索引建立完成。
範例
const eventSchema = new Schema({ thing: { type: 'string', unique: true } })
// This calls `Event.init()` implicitly, so you don't need to call
// `Event.init()` on your own.
const Event = mongoose.model('Event', eventSchema);
await Event.init();
console.log('Indexes are done building!');
Model.insertMany()
參數
doc(s)
«Array|Object|[object Object]»[options]
«Object» 請參閱mongodb 驅動程式選項[options.ordered=true]
«Boolean» 如果為 true,則會在遇到第一個錯誤時快速失敗。如果為 false,則會插入它可以插入的所有文檔,並稍後報告錯誤。具有ordered = false
的insertMany()
稱為「無序」insertMany()
。[options.rawResult=false]
«Boolean» 如果為 false,則返回的 promise 會解析為通過 mongoose 文檔驗證的文檔。如果為true
,則會返回來自 MongoDB 驅動程式的 原始結果,其中包含一個mongoose
屬性,該屬性包含validationErrors
和results
(如果這是無序的insertMany
)。[options.lean=false]
«Boolean» 如果為true
,則會跳過水合文檔。這表示 Mongoose 將不會強制轉換、驗證或將預設值套用於傳遞給insertMany()
的任何文檔。如果您需要額外的效能,此選項很有用,但存在資料完整性風險。請考慮與castObject()
和applyDefaults()
一起使用。[options.limit=null]
«Number» 這會限制 Mongoose 並行處理(驗證/強制轉換)的文檔數量,這不會將文檔分批發送到 MongoDB。如果您正在處理大量文檔並且您的應用程式記憶體不足,請使用此選項。[options.populate=null]
«String|Object|Array» 填充結果文檔。如果設定了rawResult
,則此選項為空操作。[options.throwOnValidationError=false]
«Boolean» 如果為 true 且ordered: false
,則在其中一個操作驗證失敗時擲回錯誤,但所有有效的操作都已成功完成。
傳回
- «Promise» 如果
options.rawResult
為true
,則解析為來自 MongoDB 驅動程式的原始結果,否則解析為通過驗證的文檔
驗證文檔陣列並在它們全部有效時將它們插入 MongoDB 的快捷方式。此函數比 .create()
快,因為它只向伺服器發送一個操作,而不是每個文檔一個操作。
Mongoose 始終在向 MongoDB 發送 insertMany
之前驗證每個文檔。因此,如果一個文檔有驗證錯誤,則不會儲存任何文檔,除非您將 ordered
選項設定為 false。
此函數不會觸發儲存中間件。
此函數會觸發以下中介軟體。
insertMany()
範例
const docs = await Movies.insertMany([
{ name: 'Star Wars' },
{ name: 'The Empire Strikes Back' }
]);
docs[0].name; // 'Star Wars'
// Return raw result from MongoDB
const result = await Movies.insertMany([
{ name: 'Star Wars' },
{ name: 'The Empire Strikes Back' }
], { rawResult: true });
Model.inspect()
console.log 的輔助程式。給定一個名為 'MyModel' 的模型,返回字串 'Model { MyModel }'
。
範例
const MyModel = mongoose.model('Test', Schema({ name: String }));
MyModel.inspect(); // 'Model { Test }'
console.log(MyModel); // Prints 'Model { Test }'
Model.listIndexes()
傳回
- «Promise»
列出目前在 MongoDB 中定義的索引。這可能與您的 schema 中定義的索引相同,也可能不同,具體取決於您是否使用autoIndex
選項以及是否手動建立索引。
Model.listSearchIndexes()
參數
[options]
«Object»
傳回
- «Promise<Array>»
列出此模型集合上的所有Atlas 搜尋索引。此函數僅在連線到 MongoDB Atlas 時有效。
範例
const schema = new Schema({ name: { type: String, unique: true } });
const Customer = mongoose.model('Customer', schema);
await Customer.createSearchIndex({ name: 'test', definition: { mappings: { dynamic: true } } });
const res = await Customer.listSearchIndexes(); // Includes `[{ name: 'test' }]`
Model.populate()
參數
docs
«Document|Array» 要填充的單個文檔或文檔陣列。options
«Object|String» 要填充的路徑或指定所有參數的物件[options.path=null]
«string» 要填充的路徑。[options.populate=null]
«string|PopulateOptions» 遞迴填充已填充文檔中的路徑。請參閱深度填充文檔。[options.retainNullValues=false]
«boolean» 預設情況下,Mongoose 會從已填充的陣列中移除 null 和未定義的值。使用此選項讓populate()
保留null
和undefined
陣列項目。[options.getters=false]
«boolean» 如果為 true,Mongoose 會呼叫在localField
上定義的任何 getter。預設情況下,Mongoose 會取得localField
的原始值。舉例來說,如果你想在你的localField
上新增一個lowercase
getter,你就需要將此選項設定為true
。[options.clone=false]
«boolean» 當你執行BlogPost.find().populate('author')
時,具有相同作者的部落格文章會共享一份author
文件副本。啟用此選項可讓 Mongoose 在指派已擴展的文件之前先複製它們。[options.match=null]
«Object|Function» 為擴展查詢新增額外的篩選條件。可以是包含MongoDB 查詢語法的篩選物件,或是回傳篩選物件的函式。[options.skipInvalidIds=false]
«Boolean» 預設情況下,如果localField
和foreignField
的 schema 不一致,Mongoose 會拋出轉換錯誤。如果你啟用此選項,Mongoose 會改為篩除任何無法轉換為foreignField
的 schema 類型的localField
屬性。[options.perDocumentLimit=null]
«Number» 由於歷史因素,搭配populate()
使用limit
可能會產生不正確的結果,因為它只針對每個要擴展的文件執行單一查詢。如果你設定perDocumentLimit
,Mongoose 會透過為每個要populate()
的文件執行單獨的查詢,來確保每個文件的limit
正確。舉例來說,.find().populate({ path: 'test', perDocumentLimit: 2 })
如果.find()
回傳 2 個文件,則會執行 2 個額外的查詢。[options.strictPopulate=true]
«Boolean» 設定為 false 以允許擴展在給定模型的 schema 中未定義的路徑。[options.options=null]
«Object» 額外的選項,例如limit
和lean
。[options.transform=null]
«Function» Mongoose 會針對每個擴展的文件呼叫的函式,可讓您轉換已擴展的文件。[callback(err,doc)]
«Function» 選用的回呼函式,在完成時執行。接收err
和doc(s)
。
傳回
- «Promise»
擴展文件參照。
在 Mongoose 6 中變更:您在上面呼叫 populate()
的模型應該是「本地欄位」模型,**而非**「外部欄位」模型。
可用的頂層選項
- path:要擴展的路徑,以空格分隔
- select:要選取的選用欄位
- match:要比對的選用查詢條件
- model:要用於擴展的選用模型名稱
- options:選用的查詢選項,例如 sort、limit 等
- justOne:選用的布林值,如果為 true,Mongoose 會始終將
path
設定為文件,如果找不到任何文件,則為null
。如果為 false,Mongoose 會始終將path
設定為陣列,如果找不到任何文件,則該陣列會是空的。預設情況下從 schema 推斷。 - strictPopulate:選用的布林值,設定為
false
以允許擴展不在 schema 中的路徑。
範例
const Dog = mongoose.model('Dog', new Schema({ name: String, breed: String }));
const Person = mongoose.model('Person', new Schema({
name: String,
pet: { type: mongoose.ObjectId, ref: 'Dog' }
}));
const pets = await Pet.create([
{ name: 'Daisy', breed: 'Beagle' },
{ name: 'Einstein', breed: 'Catalan Sheepdog' }
]);
// populate many plain objects
const users = [
{ name: 'John Wick', dog: pets[0]._id },
{ name: 'Doc Brown', dog: pets[1]._id }
];
await User.populate(users, { path: 'dog', select: 'name' });
users[0].dog.name; // 'Daisy'
users[0].dog.breed; // undefined because of `select`
Model.prototype.$model()
參數
[name]
«String» 模型名稱
傳回
- «Model»
如果沒有指定 name
,則回傳用於建立此文件的模型實例。如果指定了 name
,則回傳具有指定 name
的模型。
範例
const doc = new Tank({});
doc.$model() === Tank; // true
await doc.$model('User').findById(id);
Model.prototype.$where
類型
- «property»
在呼叫 save()
時要附加到查詢的其他屬性,且 isNew
為 false。
Model.prototype.base
類型
- «property»
模型使用的基礎 Mongoose 實例。
Model.prototype.baseModelName
類型
- «property»
如果這是鑑別器模型,則 baseModelName
是基礎模型的名稱。
Model.prototype.collection
類型
- «property»
此模型使用的集合實例。Mongoose 集合是 [MongoDB Node.js 驅動程式集合](MongoDB Node.js 驅動程式集合)的精簡封裝。使用 Model.collection
表示您繞過了 Mongoose 中介軟體、驗證和轉換。
此屬性為唯讀。修改此屬性不會有任何作用。
Model.prototype.collection
類型
- «property»
模型使用的集合。
Model.prototype.db
類型
- «property»
模型使用的連線。
Model.prototype.deleteOne()
傳回
- «Query» 查詢
Model.prototype.discriminators
類型
- «property»
此模型的已註冊鑑別器。
Model.prototype.increment()
參見
Model.prototype.model()
參數
[name]
«String» 模型名稱
傳回
- «Model»
如果沒有指定 name
,則回傳用於建立此文件的模型實例。如果指定了 name
,則回傳具有指定 name
的模型。
範例
const doc = new Tank({});
doc.$model() === Tank; // true
await doc.$model('User').findById(id);
Model.prototype.modelName
類型
- «property»
模型的名稱
Model.prototype.save()
參數
[options]
«Object» 選用的選項[options.safe]
«Object» (已棄用) 覆寫schema 的 safe 選項。請改用w
選項。[options.validateBeforeSave]
«Boolean» 設定為 false 以儲存而不進行驗證。[options.validateModifiedOnly=false]
«Boolean» 如果為true
,Mongoose 將只驗證已修改的路徑,而不是已修改的路徑和required
路徑。[options.w]
«Number|String» 設定寫入關注。覆寫schema 層級的writeConcern
選項[options.j]
«Boolean» 設定為 true,讓 MongoDB 等待此save()
已記錄在日誌中,再解析回傳的 Promise。覆寫schema 層級的writeConcern
選項[options.wtimeout]
«Number» 設定寫入關注的逾時。覆寫schema 層級的writeConcern
選項。[options.checkKeys=true]
«Boolean» MongoDB 驅動程式預設會阻止您儲存以 '$' 開頭或包含 '.' 的索引鍵。將此選項設定為false
以跳過該檢查。請參閱欄位名稱的限制[options.timestamps=true]
«Boolean» 如果為false
且已啟用時間戳記,則跳過此save()
的時間戳記。[options.pathsToSave]
«Array» 路徑的陣列,告知 Mongoose 僅驗證和儲存pathsToSave
中的路徑。
傳回
- «Promise»
參見
如果 document.isNew 為 true
,則將新文件插入資料庫以儲存此文件,如果 isNew
為 false
,則只傳送具有已修改路徑的 updateOne 作業。
範例
product.sold = Date.now();
product = await product.save();
如果儲存成功,則回傳的 Promise 會以儲存的文件完成。
範例
const newProduct = await product.save();
newProduct === product; // true
Model.recompileSchema()
傳回
- «undefined,void»
在此模型編譯後,套用對此模型 schema 所做的變更。預設情況下,在模型編譯後將虛擬屬性和其他屬性新增到 schema 不會有任何作用。呼叫此函式以套用稍後新增的虛擬屬性和屬性。
範例
const schema = new mongoose.Schema({ field: String });
const TestModel = mongoose.model('Test', schema);
TestModel.schema.virtual('myVirtual').get(function() {
return this.field + ' from myVirtual';
});
const doc = new TestModel({ field: 'Hello' });
doc.myVirtual; // undefined
TestModel.recompileSchema();
doc.myVirtual; // 'Hello from myVirtual'
Model.replaceOne()
參數
filter
«Object»doc
«Object»[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.strict]
«Boolean|String» 覆寫綱要的 strict 模式選項[options.upsert=false]
«Boolean» 如果為 true,且未找到任何文檔,則插入新文檔。[options.writeConcern=null]
«Object» 設定複本集的寫入關注。覆寫schema 層級寫入關注[options.timestamps=null]
«Boolean» 如果設定為false
且已啟用schema 層級時間戳記,則跳過此更新的時間戳記。如果未設定 schema 層級時間戳記,則不會執行任何動作。[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。
傳回
- «Query»
參見
使用指定的文件取代現有的文件 (不使用像 $set
的原子運算子)。
範例
const res = await Person.replaceOne({ _id: 24601 }, { name: 'Jean Valjean' });
res.matchedCount; // Number of documents matched
res.modifiedCount; // Number of documents modified
res.acknowledged; // Boolean indicating the MongoDB server received the operation.
res.upsertedId; // null or an id containing a document that had to be upserted.
res.upsertedCount; // Number indicating how many documents had to be upserted. Will either be 0 or 1.
此函數會觸發以下中介軟體。
replaceOne()
Model.schema
類型
- «property»
模型使用的 Schema。
Model.startSession()
參數
[options]
«Object» 請參閱mongodb 驅動程式選項[options.causalConsistency=true]
«Boolean» 設定為 false 以停用因果一致性
傳回
- «Promise<ClientSession>» 解析為 MongoDB 驅動程式
ClientSession
的 Promise
需要 MongoDB >= 3.6.0。 啟動 MongoDB 會話,以獲得因果一致性、可重試寫入和交易等好處。
呼叫 MyModel.startSession()
等同於呼叫 MyModel.db.startSession()
。
此函式不會觸發任何中介軟體。
範例
const session = await Person.startSession();
let doc = await Person.findOne({ name: 'Ned Stark' }, null, { session });
await doc.remove();
// `doc` will always be null, even if reading from a replica set
// secondary. Without causal consistency, it is possible to
// get a doc back from the below query if the query reads from a
// secondary that is experiencing replication lag.
doc = await Person.findOne({ name: 'Ned Stark' }, null, { session, readPreference: 'secondary' });
Model.syncIndexes()
參數
[options]
«Object» 要傳遞到ensureIndexes()
的選項[options.background=null]
«Boolean» 如果指定,則會覆寫每個索引的background
屬性
傳回
- «Promise»
使 MongoDB 中的索引與此模型 schema 中定義的索引相符。此函式會刪除任何未在此模型 schema 中定義的索引 (_id
索引除外),並建立您 schema 中但 MongoDB 中沒有的任何索引。
如需詳細資訊,請參閱簡介部落格文章。
範例
const schema = new Schema({ name: { type: String, unique: true } });
const Customer = mongoose.model('Customer', schema);
await Customer.collection.createIndex({ age: 1 }); // Index is not in schema
// Will drop the 'age' index and create an index on `name`
await Customer.syncIndexes();
您應該小心在重負載下的生產應用程式上執行 syncIndexes()
,因為索引建置是昂貴的操作,且非預期的索引刪除可能會導致效能降低。在執行 syncIndexes()
之前,您可以使用diffIndexes()
函式來檢查 syncIndexes()
將會刪除和建立哪些索引。
範例
const { toDrop, toCreate } = await Model.diffIndexes();
toDrop; // Array of strings containing names of indexes that `syncIndexes()` will drop
toCreate; // Array of strings containing names of indexes that `syncIndexes()` will create
Model.translateAliases()
參數
fields
«Object» 可能包含別名索引鍵的欄位/條件[errorOnDuplicates]
«Boolean» 如果為 true,如果fields
中同時存在索引鍵和該索引鍵的別名,則會擲回錯誤
傳回
- «Object» 已轉換的「純」欄位/條件
轉換任何別名欄位/條件,讓最終的查詢或文件物件是純的
範例
await Character.find(Character.translateAliases({
'名': 'Eddard Stark' // Alias for 'name'
});
預設情況下,translateAliases()
會使用別名欄位覆寫原始欄位。因此,如果 n
是 name
的別名,則 { n: 'alias', name: 'raw' }
會解析為 { name: 'alias' }
。但是,如果存在可能衝突的路徑,您可以設定 errorOnDuplicates
選項來擲回錯誤。查詢的 translateAliases
選項使用 errorOnDuplicates
。
注意
只轉換物件類型的引數,其他任何引數都回傳原始值
Model.updateMany()
參數
filter
«Object»update.
«Object|Array» 如果是陣列,則此更新將被視為更新管線,而不是轉換。[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.strict]
«Boolean|String» 覆寫綱要的 strict 模式選項[options.upsert=false]
«Boolean» 如果為 true,且未找到任何文檔,則插入新文檔。[options.writeConcern=null]
«Object» 設定複本集的寫入關注。覆寫schema 層級寫入關注[options.timestamps=null]
«Boolean» 如果設定為false
且已啟用schema 層級時間戳記,則跳過此更新的時間戳記。如果未設定 schema 層級時間戳記,則不會執行任何動作。[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。[options.overwriteDiscriminatorKey=false]
«Boolean» Mongoose 預設會從update
中移除鑑別器鍵更新,將overwriteDiscriminatorKey
設定為true
以允許更新鑑別器鍵。
傳回
- «Query»
參見
與 updateOne()
相同,但無論 multi
選項的值為何,MongoDB 都會更新符合 filter
的所有文件 (而不是只有第一個)。
注意 updateMany 將不會觸發更新中介軟體。請改用 pre('updateMany')
和 post('updateMany')
。
範例
const res = await Person.updateMany({ name: /Stark$/ }, { isDeleted: true });
res.matchedCount; // Number of documents matched
res.modifiedCount; // Number of documents modified
res.acknowledged; // Boolean indicating the MongoDB server received the operation. This may be false if Mongoose did not send an update to the server because the update was empty.
res.upsertedId; // null or an id containing a document that had to be upserted.
res.upsertedCount; // Number indicating how many documents had to be upserted. Will either be 0 or 1.
此函數會觸發以下中介軟體。
updateMany()
Model.updateOne()
參數
filter
«Object»update.
«Object|Array» 如果是陣列,則此更新將被視為更新管線,而不是轉換。[options]
«Object» 可選,請參閱Query.prototype.setOptions()
[options.strict]
«Boolean|String» 覆寫綱要的 strict 模式選項[options.upsert=false]
«Boolean» 如果為 true,且未找到任何文檔,則插入新文檔。[options.writeConcern=null]
«Object» 設定複本集的寫入關注。覆寫schema 層級寫入關注[options.timestamps=null]
«Boolean» 如果設定為false
且啟用schema 層級時間戳,則跳過此更新的時間戳。請注意,這允許您覆寫時間戳。如果未設定 schema 層級時間戳,則不會執行任何操作。[options.translateAliases=null]
«Boolean» 如果設定為true
,則會轉換filter
、projection
、update
和distinct
中任何綱要定義的別名。如果任何物件同時定義了別名和原始屬性而發生衝突,則會擲回錯誤。[options.overwriteDiscriminatorKey=false]
«Boolean» Mongoose 預設會從update
中移除鑑別器鍵更新,將overwriteDiscriminatorKey
設定為true
以允許更新鑑別器鍵。
傳回
- «Query»
參見
只更新符合 filter
的第一個文件。
- 如果您想要覆寫整個文件,而不是使用像
$set
的原子運算子,請使用replaceOne()
。
範例
const res = await Person.updateOne({ name: 'Jean-Luc Picard' }, { ship: 'USS Enterprise' });
res.matchedCount; // Number of documents matched
res.modifiedCount; // Number of documents modified
res.acknowledged; // Boolean indicating the MongoDB server received the operation. This may be false if Mongoose did not send an update to the server because the update was empty.
res.upsertedId; // null or an id containing a document that had to be upserted.
res.upsertedCount; // Number indicating how many documents had to be upserted. Will either be 0 or 1.
此函數會觸發以下中介軟體。
updateOne()
Model.updateSearchIndex()
參數
name
«String»definition
«Object»
傳回
- «Promise»
更新現有的 Atlas 搜尋索引。此函式只在連線至 MongoDB Atlas 時有效。
範例
const schema = new Schema({ name: { type: String, unique: true } });
const Customer = mongoose.model('Customer', schema);
await Customer.updateSearchIndex('test', { mappings: { dynamic: true } });
Model.validate()
參數
obj
«Object»pathsOrOptions
«Object|Array|String»[context]
«Object»
傳回
- «Promise<Object>» 如果驗證成功,則回傳
obj
的已轉換和已驗證副本
根據此模型的 schema 轉換和驗證指定的物件,並將指定的 context
傳遞給自訂驗證器。
範例
const Model = mongoose.model('Test', Schema({
name: { type: String, required: true },
age: { type: Number, required: true }
});
try {
await Model.validate({ name: null }, ['name'])
} catch (err) {
err instanceof mongoose.Error.ValidationError; // true
Object.keys(err.errors); // ['name']
}
Model.watch()
參數
[pipeline]
«Array»[options]
«Object» 請參閱 mongodb 驅動程式選項[options.hydrate=false]
«Boolean» 如果為 true 且設定了fullDocument: 'updateLookup'
,Mongoose 將自動將fullDocument
水合為完全成熟的 Mongoose 文件
傳回
- «ChangeStream» Mongoose 特定的變更串流包裝函式,繼承自 EventEmitter
需要執行 MongoDB 3.6.0 或更高版本的副本集。 使用 MongoDB 變更串流監看底層集合的變更。
此函數不會觸發任何中介軟體。特別是,它不會觸發聚合中介軟體。
ChangeStream 物件是一個事件發射器,它會發射以下事件:
- 'change':發生變更,請參閱以下範例
- 'error':發生無法復原的錯誤。特別是,如果變更串流失去與副本集主節點的連線,目前會發生錯誤。請追蹤 此 GitHub 問題以獲取更新。
- 'end':如果底層串流已關閉,則會發射此事件
- 'close':如果底層串流已關閉,則會發射此事件
範例
const doc = await Person.create({ name: 'Ned Stark' });
const changeStream = Person.watch().on('change', change => console.log(change));
// Will print from the above `console.log()`:
// { _id: { _data: ... },
// operationType: 'delete',
// ns: { db: 'mydb', coll: 'Person' },
// documentKey: { _id: 5a51b125c5500f5aa094c7bd } }
await doc.remove();
Model.where()
參數
path
«字串»[val]
«物件» 選擇性值
傳回
- «Query»
建立一個查詢 (Query),套用傳遞的條件,並傳回該查詢。
例如,我們可以寫成這樣:
User.find({ age: { $gte: 21, $lte: 65 } });
而不是寫成這樣:
User.where('age').gte(21).lte(65).exec();
由於 Query 類別也支援 where
,您可以繼續鏈式呼叫
User
.where('age').gte(21).lte(65)
.where('name', /^b/i)
... etc