在Mongoose中,有一个很棒且有用的功能,称为Population,这使得可以动态地将字段连接到另一个集合中的另一个文档。
假设,在 sales 文档中,您拥有 codumer 字段。服装师可能是 Person 或A Company 。而且您想将顾客留在一个领域。没问题。您可以像下面的模式一样创建一个模式。
costumer: { type: ObjectId, refPath: "costumerType" },
costumerType: { type: String, enum: ["people", "companies"] }
然后,当您需要获取此 sales 文档时,您可以按照以下“填充”服装师字段。
await sales.find({}).populate("costumer")
Mongoose将为您带来顾客,无论是个人还是公司。
非常有用。
切换到聚合API
如果您构建了更大的应用程序,则可能需要复杂的数据库查询。 MongoDB具有一个很棒的查询API,称为聚合API。
在与聚合API合作的那一刻,您可能会遇到一个限制,即聚合不直接支持动态查找 - 查找($ lookup)是用于从同一数据库中带来其他收藏的文档的操作员。
然而,没有什么是不可能的。
我创建了一个通过以下方法使动态查找成为可能的技巧。
await sales.aggregate([
// Lookup for people and get result into "_temporaryPeople"
{ $lookup: {
from: "people",
localField: "costumer",
foreignField: "_id",
as: "_temporaryPeople",
}},
// Lookup for companies and get result into "_temporaryCompanies"
{ $lookup: {
from: "companies",
localField: "costumer",
foreignField: "_id",
as: "_temporaryCompanies",
}},
// Set "costumer" field with merge of two variables.
// This will set "costumer" the wanted document.
{ $set: {
costumer: {
$mergeObjects: [
{ $first: "$_temporaryPeople" },
{ $first: "$_temporaryCompanies" },
]
}
}},
// After we're done, we can destroy temporary fields.
{ $unset: ["_temporaryPeople", "_temporaryCompanies"] },
])
直到MongoDB向聚合API添加动态查找,
我认为这是处理此问题的最简单方法。
留在mongodbð到