你能为Mongoose的子文档定义实例方法吗?

6
如果我在Mongoose中有一个定义如下的Schema:
var subSchema = new Schema({
  some: String
});

var topSchema = new Schema({
  subs: [subSchema]
});

var topModel = mongoose.model("Top", topSchema);

是否可以为子文档定义实例方法?我尝试过以下方式(在模型声明之前添加),但它不起作用:

subSchema.methods.someFn = function() { 
  return 'blah';
};

你能详细说明一下“它不起作用”是什么意思吗? - JohnnyHK
实际上,我发现我想做的事情不起作用,但我实际上做的却有效。我想要的是一个可以在子文档集合上使用的函数,即 topdoc.subs.someFn(),但我实际声明的是 topdoc.subs[i].someFn() - wciu
1
啊,很高兴听到那个起作用了。 - JohnnyHK
@wciu 如果您解决了问题,请将解决方案发布为此问题的答案并接受它 :) - Benjamin Gruenbaum
你可以使用topdoc.someFn(topdoc.subs)代替topdoc.subs.someFn()吗? - leesei
1个回答

3

回答我自己的问题。

我最初想要做的是创建一个可以在子文档集合上使用的函数,如下:

topdoc.subs.someFn();

然而,我在原问题的代码中实际上是为一个子文档创建了一个函数,如下所示:
topdoc.subs[i].someFn();

这有效。

据我所知,Mongoose不支持为子文档集合创建函数。

我通过在topSchema中定义一个方法来解决了这个问题,该方法可以实现我想要的功能。


两年后,我想创建一个子文档实例方法来更新子文档。你知道这是否可能吗?this.save()似乎不起作用。请参见:http://stackoverflow.com/questions/29998323 - Antrikshy
子文档无法保存,您需要保存父文档。因此,this.parent().save() 应该可以工作,但您需要进行测试。 - wciu
我已经重构了代码,现在我会尝试这个。如果它有效,我会告诉你并让你将其发布为答案。看起来很有前途。谢谢! - Antrikshy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接