Javascript 使用Mongoose在字段的子字符串上填充
我正在将我的API从Parse.com迁移到我自己的Express.js代码。我创建了我的mongoose模型来匹配parse创建的数据库,但是我遇到了一个关于指针关系的问题 下面是两个尽可能简化的模型Javascript 使用Mongoose在字段的子字符串上填充,javascript,mongodb,parse-platform,mongoose,Javascript,Mongodb,Parse Platform,Mongoose,我正在将我的API从Parse.com迁移到我自己的Express.js代码。我创建了我的mongoose模型来匹配parse创建的数据库,但是我遇到了一个关于指针关系的问题 下面是两个尽可能简化的模型 const CustomerSchema = new mongoose.Schema({ _id : { type: String, required: true, default: () => randomstring.generate(10) }, name
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是指向组的指针,但parse不在其中存储id,而是存储组$u id。例如,如果客户来自id为ndj879gLjt的组,_p_group将包含组$ndj879gLjt
我如何处理人际关系?如何返回客户及其组?通常的方法是将ref:Group添加到_p_Group的选项中,并执行Customer.find{}.populate“u p_Group”,但由于明显的原因,它在这里不起作用
Parse使用的是mongodb,而不是mongoose,所以一定有办法。此外,解决方案必须与Parse兼容。在最坏的情况下,我仍然可以创建一个新的字段\u customer,该字段将包含id,但这将使我更新20Go的数据,这并不是我真正想要的。因此,在查看之后,似乎他们实际上正在执行多个请求,而根本不使用填充。他们首先会找到与查询匹配的所有客户,然后循环搜索结果以获得groupId列表,然后他们会查询[list of groupId]中的Group where _id。因此,在查看之后,看起来他们实际上在执行多个请求,根本不使用填充。他们首先会找到与查询匹配的所有客户,然后循环查询结果以获得groupId列表,然后他们会查询[list of groupId]中的组,其中_id。要填充工作,您的类型应该是mongoose.Schema.ObjectId,以便存储ObjectId,并且属性ref应该是引用的集合的名称 我认为以下内容应该适用于populate
要使“填充”工作,您的类型应为mongoose.Schema.ObjectId,以便存储ObjectId,而property ref应为引用的集合的名称 我认为以下内容应该适用于populate
在一个完美的世界中,它会这样做,但_p_group是由Parse设置的,它会在其中放入一个特殊的字符串。将类型更改为ObjectId将破坏与Parse的兼容性。我的数据库中已经有数百万行了,我不能那么轻易地改变类型。啊,对了。您可以将ref传递给populate调用,即:Customer.find.populate“u p_group”,null,“group”,但这仍然存在“u id”前面有group$的问题。我不确定执行顺序,但也许您可以绑定到CustomerSchema.post'find',functor,n{r=r.mapfunctiona{a.\u id.replace'Group$,;返回a;};n};来处理ID。不确定是否会在填充之前调用,只是猜测而已。好主意,但不幸的是它不起作用,调用代码太晚了。post实际上是在_p_组上的getter集之后调用的。在一个完美的世界中,它会被调用,但是_p_组是通过Parse设置的,它会在其中放入一个特殊的字符串。将类型更改为ObjectId将破坏与Parse的兼容性。我的数据库中已经有数百万行了,我不能那么轻易地改变类型。啊,对了。您可以将ref传递给populate调用,即:Customer.find.populate“u p_group”,null,“group”,但这仍然存在“u id”前面有group$的问题。我不确定执行顺序,但也许您可以绑定到CustomerSchema.post'find',functor,n{r=r.mapfunctiona{a.\u id.replace'Group$,;返回a;};n};来处理ID。不确定是否会在填充之前调用,只是猜测而已。好主意,但不幸的是它不起作用,调用代码太晚了。post实际上是在getter设置为_p_group之后调用的。我到底为什么会得到否决票?如果Parse不是这样解释的,那么它就是一个有效的答案。这不是一个好的、干净的答案,但这仍然是它目前在解析方面的工作方式,人们可能想知道或者想做同样的事情。为什么我会被否决?如果Parse不是这样解释的,那么它就是一个有效的答案。这不是一个好的、干净的答案,但这仍然是它目前处理解析的方式,人们可能想知道或者想做同样的事情。
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 },
});