[英]Difference between Mongoose array and Javascript Array
最近,我在 Mongoose 上遇到了一个很复杂的问题,是关于数组的使用。 有不同的使用经验,但我找不到任何关于此的讨论或问题,所以我试图在这里解释,并询问有人知道发生了什么。
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"}]
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;
}
我不能完全理解它,但我试着用我的猜想来描述。
Mongoose 在推送对象时需要将 javascript 对象转换为子文档。 (我以为它检查了save()
)
MongooseArray.push()
将对象的属性复制到新对象,因此实际上并未添加从参数传递的原始引用。
这只是薄弱的解释,希望有人能帮助更好地解释它。
是的 mongoose 数组是不同的,它们在原型上有自己的 push 、 pop 等实现。 您可以在此处找到文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.