【问题标题】:Mongoose - Need two schemas for full and min versions of a model for a document-collectionMongoose - 文档集合的模型的完整版本和最小版本需要两个模式
【发布时间】:2016-07-06 14:47:32
【问题描述】:

在@enRaiser 的回答后编辑。

我有一个沙盒 mongoDB 数据库,其中包含一个名为“hotels”的集合,其文档架构如下所示:

var roomSchema = new mongoose.Schema({
  type: String, 
  number: Number,
  description: String,
  photos: [ String ],
  price: Number
});

var hotelSchema = new mongoose.Schema({ 
    name: String, 
    stars: Number,
    description: String, 
    photos: [ String ],
    currency: String,

    location: {
        address: String,
        coordinates: [ Number ] /* enforce later validation to have max of two numbers in the array */
    },

    rooms: [roomSchema],

    reviews: [{
            name: String,
            id: String,
            review: String,
            rating: Number
    }],

    services: [ String ]
});

现在,我想为 Hotel 提供两个版本的架构,一个用于“深度”数据模型,另一个用于最小模型。

var hotelMinSchema = new mongoose.Schema({
    name: String, 
    stars: Number,
    location: {
        address: String,
        coordinates: [ Number ]
    },
    currency: String
})

module.exports = {
  full: mongoose.model('hotel', hotelSchema),
  min: mongoose.model('hotel', hotelMinSchema)
}

显然我不应该有两个模型来收藏。不太确定。我收到此错误。

OverwriteModelError: 编译后无法覆盖hotel 模型。

我认为应该有一个解决方法。任何帮助或建议将不胜感激。

【问题讨论】:

  • 这仍然没有意义。为什么要为同一件事制定两个不同的方案?为什么不直接使用optional attributes?
  • Hotel.find({ }).select('name stars location currency').. gotcha.. 刚找到这个。请不要投反对票..

标签: javascript node.js mongodb mongoose


【解决方案1】:

这是开发任何数据库的完全错误的方式。即使在 MYSQL 中,我也不会想到这种设计 DB 的方式。 首先有重复的数据。你总是必须注意同步它们。 第二,即使在您的完整模型中,也会有重复的评论。评论信息存在于用户(即评论者和博主)中

与数据库无关。当您想到解决方案时,您必须识别真实的实体。在您的用例中,这里只有两个实体用户和评论。所以只做两个模型。不多。(如果是MYSQL,我会说只做两个表用户表和评论表。)

然后建立它们之间的关系。为此,猫鼬学习了如何建立关系以及如何根据关系填充该数据。就像在 MYSQL 中设置外键一样。

【讨论】:

  • 我知道@enRaiser。我知道有重复。我无法控制现有数据。如今,重复并不是一件坏事,(因为存储很便宜)..
  • 我编辑了我的问题。我知道有重复的数据,我给出的是一个不好的例子来描述我面临的问题。我现在发布了实际问题。
【解决方案2】:

抱歉,我才发现这个。

   var hotelListPromise = Hotel.find({})
            .select('name stars location currency')
            .exec((err, hotelData) => {
            // my callback stuff here
    });

【讨论】:

  • 所以你奇怪的方法就是能够做一个projection?你为什么不一开始就提出这个要求?
  • 抱歉,直到您发表评论才让我印象深刻。谢谢!
  • 我现在觉得自己好蠢。我希望我能把这整件事倒回去!啊……对不起@str
  • 另外,@str,我怎样才能在同一个查询中获得每家酒店的起始房价?
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 2015-05-08
  • 2016-09-07
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
相关资源
最近更新 更多