132

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

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
4

5 回答 5

233

听起来 populate 方法就是你要找的。首先对您的帖子架构进行小的更改:

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
});
于 2013-08-01T18:44:33.447 回答
28

附录:没有人提到“填充”——非常值得您花时间和金钱查看 Mongooses 填充方法:还解释了跨文档引用

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

于 2014-02-12T04:52:51.340 回答
12

回复晚了,不过补充一下Mongoose也有Subdocuments的概念

使用这种语法,您应该能够像这样引用您userSchema的类型postSchema

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}],
});

请注意带有 type 的更新postedBy字段userSchema

这会将用户对象嵌入帖子中,从而节省使用引用所需的额外查找。有时这可能更可取,其他时候 ref/populate 路线可能是要走的路。取决于您的应用程序在做什么。

于 2020-03-16T20:29:48.177 回答
0
{body: "string", by: mongoose.Schema.Types.ObjectId}

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

于 2021-07-18T14:28:32.983 回答
0

这是对 D. Lowe 的回答的补充,该回答对我有用,但需要进行一些调整。(我会将此作为评论,但我没有这样做的声誉,我希望在几个月后再次遇到此问题时看到此信息,但我忘记了如何解决它。)

如果您要从另一个文件导入 Schema,则需要在导入的末尾添加 .schema。

注意:如果您不导入模式并使用本地模式,我不确定您是否得到 Invalid schema configuration,但导入对我来说更干净,更容易处理。

例如:

// ./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)
})
于 2022-01-06T04:13:21.587 回答