如何将猫鼬模型引用到其他模型?

时间:2020-09-23 23:22:40

标签: javascript node.js mongodb mongoose

我有一个类似这样的故事的猫鼬模式:

{
    id: {
        type: Number,
        default: 0
    },
    title: {
        type: String,
        maxLength: 60
    },
    author: {
        userid: {
            type: Number
        },
        username: {
            type: String
        }
    }
    chapters: [chapter],
    numchapters: {
        type: Number,
        default: 1
    },
    favs: {
        type: Number,
        default: 0
    },
    completed: {
        type: Boolean,
        default: false
    }
}

我想做的是在单独的集合(users)中引用文档,并使用{{1}中useridusername字段的值}字段。 我该怎么做?

当前代码:

author

只要相关,storyobj.populate('author', {path: 'author', model: 'users', select: 'userid username'}, (err) => { if (err) { console.log(err) } }) 集合的结构如下:

users

编辑:

我已将Stories模型中的{ username: { type: String, }, email: { type: String, }, password: { type: String, }, userid: { type: Number }, isAdmin: { type: Boolean, default: false }, banned: { type: Boolean, default: false } } 字段更改为如下所示:

author

所以我告诉猫鼬,“嘿,我希望该字段引用用户集合中的用户。”

这里有更多细节,希望对您有所帮助。

完整代码:

    author: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User"
    }

var storydb = require('../models/stories/story'); var chapterdb = require('../models/stories/chapter'); var userdb = require('../models/user'); const file = JSON.parse(fs.readFileSync('test.json')); // this is a file with the data for the stories I am trying to insert into my database for (const d in file) { var storyobj = new storydb({ id: d, chapters: [] }); for (let e = 0; e < file[d].length; e++) { var abc = file[d][e]; var updatey = { chaptertitle: abc.chapter, chapterid: parseInt(abc.recid), words: abc.wordcount, notes: abc.notes, genre: abc.gid.split(', '), summary: abc.summary, hidden: undefined, loggedinOnly: undefined, posted: new Date(Date.parse(abc.date)), bands: abc.bandnames.split(', ') }; var kbv = getKeyByValue(userlookup, abc.uid); storyobj.title = abc.title; storyobj.numchapters = file[d].length; storyobj.favs = file[d][0].numfavs; updatey.characters = abc.charid.split(/, |,/g); storyobj.chapters.push(updatey) } storyobj.save(); } 中,有一个唯一ID ,代表每个故事的作者。 file返回与该唯一ID相关联的用户ID(请注意,它们不相同)。

现在,这是我遇到麻烦的地方:

我要做的是在kbv中找到一个与用户ID匹配的用户,并使其成为故事模型中的kbv属性。

我目前正在尝试使用的代码:

author

1 个答案:

答案 0 :(得分:1)

const Stories = require("./path/to/model");

Stories
    .find({ /* query */ }, { /* projection */ })
    .populate("author.username", ["userid", "username"])
    .then(/* handle resolve */)
    .catch(/* handle rejection */)

要执行此操作,必须在模型的ref键中添加一个userid键,其中ref值是其引用的模型的名称。

Story.model.js

const StorySchema = new Schema({
    author: {
        userid: { type: Schema.Types.ObjectId, ref: "users", required: true },
        /* other props */
    }
    /* other props */
});