【问题标题】:MongoDB+NodeJS Foreign keys entire documentMongoDB+NodeJS 外键整个文档
【发布时间】:2016-12-16 12:43:57
【问题描述】:

我是 NodeJS 和 MongoDB 的新手,所以也许这个问题已经被问过了,但我无法简单回答,如果是这样,我很抱歉。

我正在研究一个看起来像这样的架构:

var usersSchema              = new mongoose.Schema({
    profile          : {
        email               : {type: String, default: ''},
        password            : {type: String, default: ''},
        firstName           : {type: String, default: ''},
    },
    friends          : [{
        type                : mongoose.Schema.Types.ObjectId,
        ref                 : 'usersSchema'
    }], 
    pets          : [{
        type                : mongoose.Schema.Types.ObjectId,
        ref                 : 'petsSchema'
    }],
});

1) 是否可以创建一个引用自身的模式(这里用户指的是朋友列表,谁也是用户)?我没有找到任何反对的答案,但最好确定一下。

2) 实际上,我得到了宠物的 ObjectID 列表,但没有得到其他属性,例如姓名、血统……等。是否可以从请求中加载整个 Pets 文档?

User.findOne({ 'profile.email' :  req.user.profile.email }).populate('Pets').exec(function(err, user){  ....

==> 这只会返回宠物的对象 ID。

非常感谢您最终的回答! 祝大家有个愉快的一天!

【问题讨论】:

    标签: node.js mongodb foreign-keys documents


    【解决方案1】:

    问题是您在 ref 中指定了 Schema 名称,您需要在此处指定模型名称。

    如猫鼬网站上的示例所示

     var mongoose = require('mongoose')
    , Schema = mongoose.Schema
    
    var personSchema = Schema({
      _id     : Number,
      name    : String,
      age     : Number,
      stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
    });
    
    var storySchema = Schema({
      _creator : { type: Number, ref: 'Person' },
      title    : String,
      fans     : [{ type: Number, ref: 'Person' }]
    });
    
    var Story  = mongoose.model('Story', storySchema);
    var Person = mongoose.model('Person', personSchema);
    

    如果您采用您的架构,它将如下面的代码所示。

    var petSchema = new mongoose.Schema({
    	firstName: {
    		type: String,
    		default: ''
    	},
    	pedigree: {
    		type: String,
    		default: ''
    	}
    });
    
    
    var usersSchema = new mongoose.Schema({
    	profile: {
    		email: {
    			type: String,
    			default: ''
    		},
    		password: {
    			type: String,
    			default: ''
    		},
    		firstName: {
    			type: String,
    			default: ''
    		},
    	},
    
    	friends: [{
    		type: mongoose.Schema.Types.ObjectId,
    		ref: 'User'
    	}],
    
    	pets: [{
    		type: mongoose.Schema.Types.ObjectId,
    		ref: 'Pet'
    	}]
    });
    
    
    // we need to create a model to use it
    var User = mongoose.model('User', UserSchema);
    var Pet = mongoose.model('Pet', petSchema);

    【讨论】:

    • 您好,谢谢您的回答,我相应地更改了架构。但它似乎不起作用。我总是在检索对象 ID 而不是对象的内容。所以看起来我必须选择 Pet 表中的对象以及使用 Object ID 键进行选择。
    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    相关资源
    最近更新 更多