猫鼬填充不填充

时间:2019-12-04 10:51:16

标签: node.js mongodb mongoose mongoose-populate

我的MongoDB数据库中有两个集合:用户组件

用户的主键是 _id ,即数字。组件文档的 created_by updated_by 字段引用了它。

除了 populate 之外,其他所有方法都运行良好,我无法弄清原因。它保留值而不是相应的用户文档。我还尝试使用ObjectIds代替Numbers,但没有任何改变。

任何帮助将不胜感激。

我在模型和路由源上方列出了

组件和用户模型

models / user.js

import mongoose from 'mongoose';

const userSchema = new mongoose.Schema({
    _id: Number,
    firstName: String,
    lastName: String,
    email: String,
    password: String,
});

const User = mongoose.model('User', userSchema);

export default User;

models / component.js

import mongoose from 'mongoose';

const componentSchema = new mongoose.Schema({
    name: String,
    category: String,
    package: String,
    box: Number,
    cell: Number,
    quantity: Number,
    note: String,
    link: String,
    created_by: {
        type: Number,
        ref: 'User'
    },
    created_on: Date,
    updated_by: {
        type: Number,
        ref: 'User'
    },
    updated_on: Date
});

const Component = mongoose.model('Component', componentSchema);

export default Component;

models / index.js

import Component from './component';
import User from './user';

const models = { Component, User };

export default models;

中间件

import models from './models';

app.use((req, res, next) => {
    req.context = { models };
    next();
});

组件路由

import { Router } from "express";
const router = Router();
...
var getComponents = async (req, res) => {
    const query = req.context.models.Component.find().populate('users');

    try {
        const results = await query;
        return res.status(200).send({ results: results });
    } catch (err) {
        return res.status(400).send({ error: err });
    }
}
...
router.get('/', getComponents)

export default router;

我还尝试使用 exec

var getComponents = (req, res) =>
    req.context.models.Component.find().populate('users').exec().then(components => res.status(200).send({ results: components })).catch(err => res.status(400).send({ error: err }));

但是我得到了相同的结果。

3 个答案:

答案 0 :(得分:1)

您只需要在填充路径中使用现有的字段名称,例如.populate('created_by')

这是测试:

我首先使用此请求正文创建了一个用户:

{
    "_id": 111,
    "firstName": "John",
    "lastname": "River",
    "email": "abc@def.net",
    "password": "123123"
}

然后我创建了两个组件:

{
    "name": "component 1",
    "quantity": 1,
    "created_by": 111
}

{
    "name": "component 2",
    "quantity": 2,
    "created_by": 111
}

并使用以下代码:

const result = await Component.find().populate("created_by");

结果是:

[
    {
        "_id": "5de7a89e9039c738b4008d41",
        "name": "component 1",
        "quantity": 1,
        //other fields
        "created_by": {
            "_id": 111,
            "firstName": "John",
            "email": "abc@def.net",
            "password": "123123",
            "__v": 0
        },
        "__v": 0
    },
    {
        "_id": "5de7a8aa9039c738b4008d42",
        "name": "component 2",
        "quantity": 2,
        //other fields
        "created_by": {
            "_id": 111,
            "firstName": "John",
            "email": "abc@def.net",
            "password": "123123",
            "__v": 0
        },
        "__v": 0
    }
]

答案 1 :(得分:1)

我相信会是:

created_by: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }

然后,像这样查询

Component.find().populate('created_by');

答案 2 :(得分:1)

你可以做这样的事情。

created_by: { type:Schema.Types.ObjectId, ref: 'User' }

然后查询

Component.find().populate('created_by');