使用MongoDB聚合API的动态查找
#mongodb #mongoose #aggregation #lookup

在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ð到