【问题标题】:Mongoose populate replacing ObjectIds with empty arrayMongoose 填充用空数组替换 ObjectIds
【发布时间】:2022-01-27 03:43:58
【问题描述】:

我一直在尝试使用猫鼬填充功能来连接两个模型。我可以保存一个对象,但是当尝试使用填充检索时,ObjectIds 只是替换为一个空数组。 似乎已经问了很多问题,但没有一个适合我的解决方案

user.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Route = require('./route')

var passportLocalMongoose = require('passport-local-mongoose');

const postSchema = new Schema ({
    text: {
        type: String,
        default: '',
        required: true
    }
}, {
    timestamps: true
});


const UserSchema = new Schema({
    firstname: {
        type: String
    },
    posts: [postSchema],
    route: [{
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'Route'
    }]
}, {
    timestamps: true
});

UserSchema.plugin(passportLocalMongoose);

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


module.exports = User;

route.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

const locationSchema = new Schema ({
    id: {
        type: Number,
        default: 0,
        required: true
    },
    address: {
        type: String,
        default: '',
        required: true
    },
    lat: {
        type: Number,
        default: 0,
        required: true
    },
    lng: {
        type: Number,
        default: 0,
        required: true
    }

},{ 
    timestamps: true })

const routeSchema = new Schema ({
    locations: [locationSchema],
    description: {
        journey1: {
            type: String,
            default: '',
            required: false
        },
        journey2: {
            type: String,
            default: '',
            required: false
        },
        journey3: {
            type: String,
            default: '',
            required: false
        },
        journey4: {
            type: String,
            default: '',
            required: false
        }
    }
}, {
    timestamps: true
});

module.exports = mongoose.model('Route', routeSchema);

在 REST POST 端点内

User.findOne({_id: req.user._id}, function(err,user) {
        if(user) {

            var routed = new Route();
            routed.locations = req.body.locations;
            routed.description = req.body.description;

            user.route.push(routed);
            user.save()
            .then((user) => {
                res.statusCode = 200;
                res.setHeader('Content-Type', 'application/json')
                res.json(user)
            }, (err) => next(err))
        } else {
            console.log("errored")
            err = new Error('User ' + req.body.username + ' not found');
            err.status = 404;
            return next(err);
        }
    })

在 REST GET 端点内

User.findOne({_id: req.user._id})
    .populate('route')
    .then((user) => {
        if(user){
            console.log("user")
            console.log(user)
            console.log("routes")
            console.log(user.route)
            res.statusCode = 200;
            res.setHeader('Content-Type', 'application/json')
            res.json({success: true, routes: user.route});
        }
    }, (err) => next(err))
    .catch((err) => next(err));

如果我删除填充,我会得到类似的东西

[
new ObjectId("61f053af7ba46267f4893f8f")
new ObjectId("61f053af7ba46267f4893f8f")
new ObjectId("61f053af7ba46267f4893f8f")
]

从 GET 端点但将其添加回返回 [].
我的理解是,在“new Route()”中,我正在创建一个新的 Route 对象,其 ID 存储在用户模型/文档(?)中。然后,当我调用 populate mongoose 时,会在 Route 文档中搜索这些 Id,并将它们转换为我想要的对象。我能想到的唯一问题是我没有正确创建 Route 对象,因此没有使用该 Id 存储对象,这就是为什么当我尝试将 Id 与 Route 对象交换时返回一个空数组的原因。
有什么想法还是我们都只是在黑暗中跌跌撞撞?

【问题讨论】:

  • 您是否尝试在填充中指定路径和模型?
  • 我尝试将“{path: 'route', model: 'Route'}” 添加到填充函数中,但仍然得到 [] 返回。再次删除填充函数会返回一个对象 ID 数组。

标签: javascript node.js mongoose


【解决方案1】:

不完全确定这是正确的方法,但我没有像显示的那样实例化 Route 对象,而是使用 Route.create(...) 方法,然后将其推送到路由数组,现在填充按预期工作

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2019-02-13
    • 2016-12-04
    • 2019-01-31
    • 2016-03-24
    • 2014-12-05
    相关资源
    最近更新 更多