【发布时间】: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