【问题标题】:How do I reference mongoose model to another model?如何将猫鼬模型引用到另一个模型?
【发布时间】:2020-09-25 01:18:54
【问题描述】:

我有一个看起来像这样的故事的猫鼬模式:

{
    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),并在 author 字段中使用其 useridusername 字段的值。 我该怎么做?

当前代码:

storyobj.populate('author', {path: 'author', model: 'users', select: 'userid username'}, (err) => {
            if (err) {
                console.log(err)
            }
        })

以防万一,users 集合的结构如下所示:

{
    username: {
        type: String,
    },
    email: {
        type: String,
    },
    password: {
        type: String,
    },
    userid: {
        type: Number
    },
    isAdmin: {
        type: Boolean,
        default: false
    },
    banned: {
        type: Boolean,
        default: false
    }
}

编辑:

我已将 Stories 模型中的 author 字段更改为如下所示:

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

所以我告诉 Mongoose,“嘿,我希望这个字段引用 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();
}

file 中,有一个唯一 ID 代表每个故事的作者。 kbv 返回与该唯一 ID 关联的用户 ID(请注意,它们不相同)。

现在,我遇到了麻烦:

我要做的是在 kbv 中找到与用户 ID 匹配的用户,并将其设置为故事模型中的 author 属性。

我目前用来尝试实现的代码:

storydb.findOne({storyobj}, 'author').populate("author", (f) => console.log(f));

【问题讨论】:

标签: javascript node.js mongodb mongoose


【解决方案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 */
});

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 2018-10-13
    • 1970-01-01
    • 2023-03-18
    • 2021-08-17
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多