繁体   English   中英

Mongoose 数组和 Javascript 数组的区别

[英]Difference between Mongoose array and Javascript Array

最近,我在 Mongoose 上遇到了一个很复杂的问题,是关于数组的使用。 有不同的使用经验,但我找不到任何关于此的讨论或问题,所以我试图在这里解释,并询问有人知道发生了什么。

在javascript中,对象被添加为对数组的引用

    let existed;
    let company = { _id: "87" };
    let post = { evaluations: [] };
    let cost = 5;
    let predictDays = 1;
    let content = "8";
    if(!existed)
    {
        existed = {};
        existed.company = company._id;
        post.evaluations.push(existed);
    }

    existed.cost = cost || 99999999;
    existed.predictDays = predictDays || 100;
    existed.content = content || "";
    console.log(existed);
    console.log(post.evaluations);
输出:
 {company: "87", cost: 5, predictDays: 1, content: "8"} [{company: "87", cost: 5, predictDays: 1, content: "8"}]

在 nodejs + mongoose 中,我得到了完全不同的体验。

post来自findById文档

 let existed; if(!existed) { existed = {}; existed.company = company._id; post.evaluations.push(existed); /* existed = post.evaluations.find((evaluation) => { return evaluation.company.toString() === company._id.toString(); });*/ // Uncomments this would make existed get the working reference as javascript } existed.cost = cost || 99999999; existed.predictDays = predictDays || 100; existed.content = content || ""; console.log(existed); console.log(post.evaluations);
输出:
 { company: 5d655f7743e25137f8501c38, cost: 50, predictDays: 3, content: '123321' } [{"company":"5d6562bfef7d771e4815dd4f"}]

我不知道为什么它不起作用,但是如果我取消注释代码,再次在数组中find ,我可以获得如下预期结果:

 { company: 5d655f7743e25137f8501c38, cost: 50, predictDays: 3, content: '123321' } [{"company":"5d6563391fc9b65250e83988","cost":50,"predictDays":3,"content":"123321"}]

猫鼬是否暗中改变了push行为? 希望这是足够的信息来指出我的问题,非常感谢任何信息。

我找到了当前版本 (5.6.11) 的源代码,它解释了为什么push不符合预期。

  /**
   * Wraps [`Array#push`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/push) with proper change tracking.
   *
   * @param {Object} [args...]
   * @api public
   * @method push
   * @memberOf MongooseArray
   */

  push() {
    if (this[arraySchemaSymbol] == null) {
      return _basePush.apply(this, arguments);
    }

    _checkManualPopulation(this, arguments);

    let values = [].map.call(arguments, this._mapCast, this);
    values = this[arraySchemaSymbol].applySetters(values, this[arrayParentSymbol], undefined,
      undefined, { skipDocumentArrayCast: true });
    const ret = [].push.apply(this, values);

    this._registerAtomic('$push', values);
    this._markModified();
    return ret;
  }

我不能完全理解它,但我试着用我的猜想来描述。

  1. Mongoose 在推送对象时需要将 javascript 对象转换为子文档。 (我以为它检查了save()

  2. MongooseArray.push()将对象的属性复制到新对象,因此实际上并未添加从参数传递的原始引用。

这只是薄弱的解释,希望有人能帮助更好地解释它。

是的 mongoose 数组是不同的,它们在原型上有自己的 push 、 pop 等实现。 您可以在此处找到文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM