为什么Mongoose会添加空白数组?

win*_*zer 23 mongoose mongodb node.js

我正在尝试使用我的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}},
})
Run Code Online (Sandbox Code Playgroud)

当我使用名称和子域保存文档时,这是生成的文档.

{
    "name": "Smith Company",
    "products": [],
    "subdomain": "smith"
}
Run Code Online (Sandbox Code Playgroud)

为什么默认情况下会添加带有空白数组的产品,如何阻止它?

Ins*_*dJW 14

空白数组为您提供了从模型中添加或删除元素的便捷方法.

$push $addToSet $pull 在更新中将帮助您管理您的数组元素.

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

但它可能在空白数组中.

  • 尽管如此,您仍然希望缺少某个属性来代表"与此文档无关".当这是一个常见的事情,拥有一堆空数组是一个丑陋的浪费.它似乎打败了文档数据库的美丽之一,即在同一集合中存储不同文档结构的能力.我希望看到空白数组能够在文档中没有属性,除非空白数组明确地是要保存的模型的一部分.这也很直观.那个或解释为什么它在MongoDB中是不可能的. (12认同)

Ang*_*hen 14

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

products: {
  type: [{
    name:String,
    startDate:Date,
    endDate:Date
  }],
  default: undefined
}
Run Code Online (Sandbox Code Playgroud)


小智 13

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

var UserSchema = new Schema({
  followers : {
    type: [String],
    default: undefined
  }
})
Run Code Online (Sandbox Code Playgroud)


Men*_*ual 0

因为在您的架构中,您将产品定义为对象数组。你需要尝试类似的事情:

products: {
        name:{type:String, index:true},
        startDate:Date,
        endDate:Date
    },
Run Code Online (Sandbox Code Playgroud)

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

  • 我希望它是一个数组,因为一个文档可能包含对多个产品的引用。如果我不向数据库中放入任何数据,我不希望它向数据库写入任何内容。 (2认同)