Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Mongoose在字段的子字符串上填充_Javascript_Mongodb_Parse Platform_Mongoose - Fatal编程技术网

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

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

我正在将我的API从Parse.com迁移到我自己的Express.js代码。我创建了我的mongoose模型来匹配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: 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 },
});