【问题标题】:[[[Number]]] does not want to save my [[]] array correctly[[[Number]]] 不想正确保存我的 [[]] 数组
【发布时间】:2023-04-11 03:53:01
【问题描述】:

我在 mongoose 中定义了一个三重嵌套数组。当我尝试使用 2 级深空数组对其进行初始化时,它会添加第三级。见以下代码:

import mongoose, { Schema } from 'mongoose';

const foos = mongoose.model(`FooModel`, new Schema({ numbers: [[[Number]]] }));
const oneFoo = await foos.create({ numbers: [[]] });
console.log(oneFoo.numbers);

Expected: [[]], Actual: [[[]]]

有趣的是,2 级深度数组不会发生这种情况:

const foos = mongoose.model(`FooModel`, new Schema({ numbers: [[Number]] }));
const oneFoo = await foos.create({ numbers: [] });
console.log(oneFoo.numbers);

Expected: [], Actual: []

关于为什么这不起作用的任何想法,是否有任何解决方法?

版本:

"mongodb": "3.5.4",
"mongoose": "5.9.22",

编辑:这是5.9.23 中修复的错误:

【问题讨论】:

  • 您是否尝试过使用第二种情况的单个空数组或添加一些值?以防万一
  • 添加值确实有效,但我真的想将[[]] 保存在数据库中,而不是别的。
  • 你确定不应该是[]吗? [[]] 对于空值看起来有点奇怪,即使它应该有 3 个级别
  • 嗯,其实是[[], [], [], [], [], [], []](代表一周)转化为[[[], [], [], [], [], [], []]],不太一样!
  • 我明白了,但我不明白为什么当这些空数组不携带任何信息时,你会在数组中需要这些空数组。看起来它应该在后端的某个地方在返回之前提供默认的空值,或者如果某些代码需要这些空数组,则在 Schema 中作为默认返回值。

标签: javascript node.js mongodb mongoose mongoose-schema


【解决方案1】:

原因:

在 mongoose v5.9.2(即 v5.9.1 及以下版本)之前,mongoose 实际上会按照您的预期行事。但是,出现了一个关于 mongoose 如何处理嵌套数组的类型转换的问题 (Github Link),我相信该问题的修复是导致您遇到的行为改变的原因。

解决方法:

按照问题线程here 中的建议,将castNoneArrays option 设置为false

import mongoose, { Schema } from 'mongoose';

mongoose.Schema.Types.Array.options.castNonArrays = false;

const foos = mongoose.model(`FooModel`, new Schema({ numbers: [[[Number]]] }));
const oneFoo = await foos.create({ numbers: [[]] });
console.log(oneFoo.numbers);  // Outputs: [[]]

【讨论】:

  • 很棒的发现。虽然仍然是一个错误,因为它应该抛出一个转换错误,但它没有。
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多