使用Mongoose在字段的子字符串上填充

Use populate on a substring of a field with Mongoose

本文关键字:字符串 填充 Mongoose 字段 使用      更新时间:2024-04-29

我正在将我的API从Parse.com迁移到我自己的Express.js代码。我创建了猫鼬模型来匹配解析创建的数据库,但我遇到了一个关于指针(关系)的问题。

以下是两个模型(尽可能简化)

const CustomerSchema = new mongoose.Schema({
  _id           : { type: String, required: true, default: () => randomstring.generate(10) },
  name          : { type: String, required: true, trim: true },
  _p_group      : { type: String, required: true, trim: true, set: v => `Group'$${v}`, get: v => v.substr(6) },
});

const GroupSchema = new mongoose.Schema({
  _id           : { type: String, required: true, default: () => randomstring.generate(10) },
  name          : { type: String, required: true, trim: true },
});

所以问题来了:_p_group是指向Group的"指针",但parse不在其中存储id,而是存储Group$THE_ID。例如,如果客户来自id为ndj879gLjt的组,则_p_group将包含Group$ndj879gLjt

我该如何处理关系?如何返回客户及其组?通常的方法是将ref: "Group"添加到_p_group的选项中,并执行Customer.find({}).populate('_p_group'),但由于明显的原因,它在这里不起作用。

Parse使用的是mongodb(但不是mongoose),所以必须有一种方法。此外,该解决方案必须与Parse兼容。在最坏的情况下,我仍然可以创建一个包含id的新字段_customer,但这会使我更新20Go的数据,这不是我真正想要的。

要使populate工作,您的类型应该是mongoose.Schema.ObjectId,这样就存储了ObjectId,属性ref应该是引用的集合的名称。

我认为以下内容应该适用于populate

const CustomerSchema = new mongoose.Schema({
  _id           : { type: String, required: true, default: () => randomstring.generate(10) },
  name          : { type: String, required: true, trim: true },
  _p_group      : { type: mongoose.Schema.ObjectId, ref: 'Group', required: true, trim: true },
});

因此,在查看了Parse Server源代码后,似乎他们实际上正在执行多个请求,并且根本不使用populate。他们首先会找到所有与查询匹配的Customers,然后循环结果以获得groupId列表,然后查询Group,其中_id in [list of groupId]