Mongoose 为啥要添加空白数组?

Posted

技术标签:

【中文标题】Mongoose 为啥要添加空白数组?【英文标题】:Why does Mongoose add blank arrays?Mongoose 为什么要添加空白数组? 【发布时间】:2012-09-21 09:49:43 【问题描述】:

我正在尝试通过我的 node.js 应用程序开始使用 Mongoose 作为 MongoDB 的 ODM。我注意到,当我设计一个带有嵌入式文档的模式时,如果我不向它添加值,它会在 Mongo 中存储一个空白数组“[]”。为什么是这样?我正在尝试存储对记录的历史更改,而空白数组意味着该更改删除了该值。这是一个示例架构。

schema.Client = new mongoose.Schema(
    name:type:String, required:true,
    products:[
        name:type:String, index:true,
        startDate:Date,
        endDate:Date
    ],
    subdomain:type:String, index:unique:true,
)

这是我保存仅包含名称和子域的文档时生成的文档。


    "name": "Smith Company",
    "products": [],
    "subdomain": "smith"

为什么会默认添加带有空白数组的产品,如何停止?

【问题讨论】:

数组的默认值是一个空数组,所以如果你只保存 name:"foo",subdomain:"bar" products 将是一个空数组。 有什么办法可以改变数组的默认值使其不写任何东西? 您可以在更新文档的位置发布代码吗? 我还在 mongoose 2.x 上,你可能想看看 mongoosejs.com/docs/api.html#model_Model-update ,尝试将 safe 设置为 false。 对一个不存在的数组赋予一个空数组特殊的含义是很诱人的,但由于诸如此类的问题,这是一个坏主意。最好添加一个明确的布尔标志来进行您需要的区分。 【参考方案1】:

因为在您的架构中,您将产品定义为对象数组。您需要尝试以下方法:

products: 
        name:type:String, index:true,
        startDate:Date,
        endDate:Date
    ,

这将存储一个空对象而不是数组。

【讨论】:

我希望它是一个数组,因为一个文档可能包含对多个产品的引用。如果我不向数据库中放入任何数据,我不希望它向数据库中写入任何内容。 我认为这甚至没有写入数据库 - 你检查过吗?我有一个没有数组的模型,当我刚刚添加了一个对象 id 数组并且.findOne'd 其中一个模型实例时,.toJSON 在响应中添加了空列表,即使我没有写入数据库以来。【参考方案2】:

空白数组为您提供了在模型中添加或删除元素的便捷方式。

$push$addToSet$pull 更新将帮助您管理数组元素。

如果您没有空白数组,则无法将元素推送到 null

但在空白数组中是可能的。

【讨论】:

仍有一些情况,但您希望缺少一个属性来代表“与本文档无关”。当这是很常见的事情时,拥有一堆空数组是一种丑陋的浪费。它似乎打败了文档数据库的优点之一,即在同一个集合中存储不同文档结构的能力。我希望看到空白数组能够导致文档中没有属性,除非空白数组明确是要保存的模型的一部分。这也是直观的。或者解释为什么在 MongoDB 中不可能。 目前在 mongodb 中,$push 和 $addToSet 会在没有数组的情况下创建一个数组。【参考方案3】:

这似乎是设计使然,但这里有一个解决方法,使用“pre”处理程序来删除默认的空数组:https://github.com/LearnBoost/mongoose/issues/1335

不过,这仅在我将字段设置为 null 时才对我有用。如果我在示例代码中将其设置为undefined,空数组似乎又回来了。

【讨论】:

【参考方案4】:

您可以通过定义如下架构来解决问题:

products: 
  type: [
    name:String,
    startDate:Date,
    endDate:Date
  ],
  default: undefined

【讨论】:

【参考方案5】:

默认情况下,该数组具有[] 值。你可以覆盖它:

var UserSchema = new Schema(
  followers : 
    type: [String],
    default: undefined
  
)

【讨论】:

以上是关于Mongoose 为啥要添加空白数组?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose更新嵌套数组

MongoDB VS MySQL - 为啥 mongo/mongoose 会自动创建数据库和集合?

为啥将项目添加到空白数组中会重复显示项目?

mongoose基本增删改查

为啥这个 Mongoose 更新不保存到数据库中?

为啥 Mongoose 插入 null 作为子文档数组的最后一个元素?