【问题标题】:How to get Schema of mongoose database which defined in another model如何获取在另一个模型中定义的猫鼬数据库的架构
【发布时间】:2012-02-02 13:18:28
【问题描述】:

这是我的文件夹结构:

+-- express_example
|---- app.js
|---- models
|-------- songs.js
|-------- albums.js
|---- and another files of expressjs

我在文件 song.js 中的代码

var mongoose = require('mongoose')
, Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;

var SongSchema = new Schema({
name: {type: String, default: 'songname'}
, link: {type: String, default: './data/train.mp3'}
, date: {type: Date, default: Date.now()}
, position: {type: Number, default: 0}
, weekOnChart: {type: Number, default: 0}
, listend: {type: Number, default: 0}
});

module.exports = mongoose.model('Song', SongSchema);

这是我在文件 albums.js 中的代码

var mongoose = require('mongoose')
, Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;

var AlbumSchema = new Schema({
name: {type: String, default: 'songname'}
, thumbnail: {type:String, default: './images/U1.jpg'}
, date: {type: Date, default: Date.now()}
, songs: [SongSchema]
});

module.exports = mongoose.model('Album', AlbumSchema);


我怎样才能让 Albums.js 知道要定义的 SongSchema AlbumSchema

【问题讨论】:

    标签: javascript node.js mongodb mongoose nosql


    【解决方案1】:

    您可以使用 Mongoose 直接在别处定义模型:

    require('mongoose').model(name_of_model)
    

    要在 Albums.js 中获取示例中的架构,您可以这样做:

    var SongSchema = require('mongoose').model('Song').schema
    

    【讨论】:

    • 如果我的数据库结构是这样的,那么一张专辑我可以存储很多歌曲,对吗?
      为什么在 app.js 中这样做:
      var Album = db.model('Album'); var album = new Album(); album.songs.push({_id:'4f046b3bf71f5ed522000002'});
      我收到错误 Cannot call method 'call' of undefined
      我如何存储到正确的位置?
    • 我得到了完全相同的东西。最后改用var SongSchema = require('mongoose').model('Song').schema 来修复它(即我添加了.schema 来专门获取模型的模式)。
    • 那么当有多个连接时它是如何工作的呢?它用的是哪一个?
    【解决方案2】:
    var SongSchema = require('mongoose').model('Song').schema;
    

    albums.js 中的上述代码行肯定会起作用。

    【讨论】:

    • @Prasad Jadhav:感谢改进
    • 那行不通,因为它不返回架构而是返回模型。
    【解决方案3】:

    要从已注册的 Mongoose 模型中获取架构,您需要专门访问该架构:

    var SongSchema = require('mongoose').model('Song').schema;
    

    【讨论】:

      【解决方案4】:

      对于其他不熟悉 Mongoose 工作原理的人来说,现有答案可能会令人困惑。

      这是一个通用实现示例,该示例从另一个文件导入 模式,该文件可供来自更通用上下文的更广泛受众访问。

      const modelSchema = require('./model.js').model('Model').schema
      

      这是问题中特定案例的修改版本(这将在inside albums.js 中使用)。

      const SongSchema = require('./songs.js').model('Song').schema
      

      从这里,我可以看到您首先访问并要求文件,通常情况下需要一个模型,除非在这种情况下,您现在专门访问该模型的架构。

      其他答案需要 mongoose within 变量声明,这与常见的需要 mongoose 的示例背道而驰,即在声明变量(例如 const mongoose = require('mongoose');)然后使用 mongoose 之前。这样的用例对我来说在知识方面是无法理解的。


      备选方案

      您可以像往常一样要求只需要模型,然后通过模型的架构属性引用架构。

      const mongoose = require('mongoose');
      
      // bring in Song model
      const Song = require('./songs.js');
      
      const AlbumSchema = new Schema({
          // access built in schema property of a model
          songs: [Song.schema]
      });
      

      【讨论】:

        【解决方案5】:
        "songs" : [{type: Schema.Types.ObjectId, ref: 'Song', required: true}]
        

        【讨论】:

        • 他可能需要嵌入而不是引用的架构
        猜你喜欢
        • 2017-04-11
        • 1970-01-01
        • 2021-05-24
        • 2012-12-27
        • 2020-04-16
        • 1970-01-01
        • 1970-01-01
        • 2018-10-13
        • 2021-04-24
        相关资源
        最近更新 更多