33

我正在尝试通过我的 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"
}

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

4

5 回答 5

39

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

products: {
  type: [{
    name:String,
    startDate:Date,
    endDate:Date
  }],
  default: undefined
}
于 2017-09-11T13:55:24.400 回答
21

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

$push $addToSet $pullin update 将帮助您管理数组元素。

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

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

于 2012-09-30T15:17:10.107 回答
13

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

var UserSchema = new Schema({
  followers : {
    type: [String],
    default: undefined
  }
})
于 2019-03-23T07:07:15.507 回答
3

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

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

于 2013-09-03T19:55:17.413 回答
0

因为在您的模式中,您将产品定义为对象数组。您需要尝试以下操作:

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

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

于 2012-09-30T02:35:58.327 回答