在 Mongoose 中引用另一个模式

如果我有两个模式,比如:

var userSchema = new Schema({
twittername: String,
twitterID: Number,
displayName: String,
profilePic: String,
});


var  User = mongoose.model('User')


var postSchema = new Schema({
name: String,
postedBy: User,  //User Model Type
dateCreated: Date,
comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

我试着像上面的例子一样把它们连接起来,但是我不知道怎么做。最终,如果我能做这样的事情,它会使我的生活非常容易

var profilePic = Post.postedBy.profilePic
193850 次浏览

听起来填充方法正是你想要的。首先对你的文章模式做一些小的改变:

var postSchema = new Schema({
name: String,
postedBy: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
dateCreated: Date,
comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

然后制作你的模型:

var Post = mongoose.model('Post', postSchema);

然后,当您进行查询时,您可以像下面这样填充引用:

Post.findOne({_id: 123})
.populate('postedBy')
.exec(function(err, post) {
// do stuff with post
});

附录: 没有人提到“人口”-这是非常值得你的时间和金钱看猫鼬人口方法: 也解释了跨文件引用

Http://mongoosejs.com/docs/populate.html

回复晚了,但补充说猫鼬也有 子文件的概念

使用这种语法,您应该能够在 postSchema中将 userSchema作为类型引用,如下所示:

var userSchema = new Schema({
twittername: String,
twitterID: Number,
displayName: String,
profilePic: String,
});


var postSchema = new Schema({
name: String,
postedBy: userSchema,
dateCreated: Date,
comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

请注意类型为 userSchema的更新后的 postedBy字段。

这将在文章中嵌入用户对象,节省使用引用所需的额外查找。有时这可能更好,其他时候可能是方法的参考/填充路径。这取决于应用程序正在执行的操作。

{body: "string", by: mongoose.Schema.Types.ObjectId}

mongoose.Schema.Types.ObjectId将创建一个新的 id,尝试将其更改为更直接的类型,如 String 或 Number。

这是对 D. Lowe 的回答的补充,他的回答对我很有用,但是需要一些调整。(我本想把这个作为一个评论,但我没有这样做的名声,我希望看到这个信息在几个月后,当我再次遇到这个问题,但我忘记了如何解决它。)

如果从另一个文件导入模式,则需要添加。架构到导入的末尾。

注意: 如果您没有导入模式,而是使用本地模式,但是导入对我来说更干净、更容易处理,那么我不确定您是否得到了无效的模式配置。

例如:

// ./models/other.js
const mongoose = require('mongoose')


const otherSchema = new mongoose.Schema({
content:String,
})


module.exports = mongoose.model('Other', otherSchema)


//*******************SEPERATE FILES*************************//


// ./models/master.js
const mongoose = require('mongoose')


//You will get the error "Invalid schema configuration: `model` is not a valid type" if you omit .schema at the end of the import
const Other=require('./other').schema




const masterSchema = new mongoose.Schema({
others:[Other],
singleOther:Other,
otherInObjectArray:[{
count:Number,
other:Other,
}],
})


module.exports = mongoose.model('Master', masterSchema);

然后,无论您在哪里使用这个(对我来说,我在 Node.js API 中使用了类似的代码) ,您都可以简单地将 other 分配给 master。

例如:

const Master= require('../models/master')
const Other=require('../models/other')


router.get('/generate-new-master', async (req, res)=>{
//load all others
const others=await Other.find()


//generate a new master from your others
const master=new Master({
others,
singleOther:others[0],
otherInObjectArray:[
{
count:1,
other:others[1],
},
{
count:5,
other:others[5],
},
],
})


await master.save()
res.json(master)
})