【问题标题】:MongooseDocumentArray assignmentMongooseDocumentArray 赋值
【发布时间】:2013-08-12 11:43:22
【问题描述】:

我在this.prices 找到了MongooseDocumentArray。我可以用this.prices = [] 清除它,它会保留它的所有方法等,并且仍然是MongooseDocumentArray。如果我先将它分配给另一个变量,例如array = this.prices,然后array 也是MongooseDocuementArray,更改一个会更改另一个(即它们看起来是同一个对象)。但是,如果我随后尝试使用array = [] 清除该数组,我发现该数组现在是一个普通的空 JS 数组。但是,执行array.length = 0 效果很好。有人可以向我解释为什么会这样以及如何使用原始对象进行操作吗?我猜这更像是 JS 的东西,而不是 Mongoose 的东西,但无论哪种方式我都感到困惑。

【问题讨论】:

    标签: javascript mongoose


    【解决方案1】:

    当你第一次说:

    this.prices = [];
    

    ...然后猫鼬正在使用所谓的“setter”来拦截分配并将其转换为MongooseDocumentArray。在幕后 mongoose 为文档上的所有路径设置执行此操作,而不仅仅是文档数组。它使用Object.defineProperty 来实现这一点。阅读更多关于它及其功能here

    之后发生的事情就更简单了。然后将其分配给另一个变量时:

    array = this.prices;
    

    ...那么您将对演员this.prices 对象的引用分配给array

    但是当你说:

    array = [];
    

    ...那么您正在更改该引用,导致array 指向一个新的Array 对象。

    另一方面,array.length = 0 修改了DocumentArray,但保持引用不变。

    如果你在the source,特别是document.js 和各种types 中进行挖掘,你可以开始弄清楚猫鼬是如何处理这个问题的。

    【讨论】:

    • 这是有道理的。我不太了解 setter 的实际工作方式。我可能应该继续这样做,因为目前它看起来很神奇。当它允许时,我会接受它。
    • 是的,那篇文章是它的要点,但它已经过时了(2007 年)。 Mongoose 使用更现代的Object.defineProperty。我会在答案中链接它。
    • 可悲的是,这让我试图保持干爽。我的模型中有几个独立但相关的 EmbeddedDocumentArrays,方法需要访问哪一个是不确定的。我希望将正确的方法传递给一个辅助方法,该方法将对传递的任何一个方法进行操作(清除它并创建新条目)。虽然使用 length = 0 让我更接近,但如果在引用变量上调用类似 create 的方法,似乎也无法正常工作。创建了文档,但架构的验证似乎不起作用,因为尽管有独特的限制,但我得到了重复的记录。
    • 你是在push-在创建文档后的一段时间内将创建的文档写入数组吗? create 应该创建对象,但实际上不会将它们添加到文档中。如果没有更多代码,很难确定您的问题是什么,但是您添加新文档的方式可能没有将父级标记为已修改,或者其他什么......您可能应该打开一个新问题来详细说明您的问题在这变成评论讨论之前。
    • 是的。我也在推他们。我会重新审视它,如果不是我在做一些愚蠢的事情,我会按照你的建议发布一个新问题。
    猜你喜欢
    • 2016-02-27
    • 2011-08-02
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 2016-01-17
    • 1970-01-01
    相关资源
    最近更新 更多