无法使用 mongoose populate() 填充文档
unable to populate documents using mongoose populate()
我正在使用 mongoose 快速创建一个应用程序。我有一个名为 users
的集合,其中有一个名为 _subscriptions
的文件,它是一个对象数组,每个对象包含一个名为 field
的字段,它是 [ 的文档的 ObjectId =16=](这是我数据库中的另一个集合)。
我想制作这样一个 API,在获取 id 参数后 returns 我是一个 user
表单 users
集合,其中填充了 field
属性而不是它在字段值中的 id field
。为此,我正在使用填充方法,但它不起作用。
这是显示 users
集合的屏幕截图:
这是显示 fields
集合的屏幕截图:
这是字段的架构(文件名 Field.js):
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var FieldSchema = new Schema(
{
_id: Schema.Types.ObjectId,
name: String,
price: Number,
_categories: [{
type: Schema.ObjectId,
}],
}
);
module.exports = mongoose.model('Field', FieldSchema);`
这是用户的架构和模型
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
_id: Schema.Types.ObjectId,
salt: String,
provider: String,
name: String,
email: {
type: String,
required: true
},
password: {
type: String,
required: true
},
_subscriptions: [{
field: {
type: mongoose.Schema.ObjectId,
ref: 'Field',
},
status: String,
dateSubscribed: Date,
payments: [{}]
}],
role: String,
});
module.exports = mongoose.model('User', UserSchema);
这是用户路由器的代码
var Field = require('../model/Field');
var express = require('express');
var router = express.Router();
var User = require('../model/User');
router.get('/',function(req, res, next) {
User.find({}, function(err, result) {
if (err) {
console.log(err);
res.send('something wrong');
}
res.status(200).send(result);
}).populate( '_subscriptions.field').exec(function (err, story) {
if (err) return handleError(err);
console.log('Here!!!!!');
});
});
router.get('/findById/:id',function(req, res, next) {
var id = req.params.id;
User.findById(id, function(err, doc) {
if (err) {
console.error('error, no entry found');
}
res.status(200).send(doc);
}).populate('field').exec(function (err, story) {
if (err) return handleError(err);
console.log('Here!!!!!');
});
});
router.get('/getSubscriptions/:id',function(req, res, next) {
var id = req.params.id;
User.findById(id, function(err, doc) {
if (err) {
console.error('error, no entry found');
}
var type = typeof(doc);
res.status(200).send(doc);
})
});
module.exports = router;
这是我调用 app.use 方法的地方:
这是我使用邮递员得到的回复
我期待有人帮助解决这个问题
因为我无法确定我的错误。非常感谢您在这方面的帮助。
提前致谢
我的理解是,在用户集合中,有_subscriptions
,在_subscriptions
中,有field
。如果这是您的架构,那么您应该将“_subscriptions.field
”作为参数传递给填充函数,而不是像您当前传递的那样传递“field
”。
因此,您的用户子路由代码 /findById/:id
必须如下所示:
router.get('/findById/:id',function(req, res, next) {
var id = req.params.id;
User.findById(id, function(err, doc) {
if (err) {
console.error('error, no entry found');
}
res.status(200).send(doc);
}).populate('_subscriptions.field').exec(function (err, story) {
if (err) return handleError(err);
console.log('Here!!!!!');
});
});
我正在使用 mongoose 快速创建一个应用程序。我有一个名为 users
的集合,其中有一个名为 _subscriptions
的文件,它是一个对象数组,每个对象包含一个名为 field
的字段,它是 [ 的文档的 ObjectId =16=](这是我数据库中的另一个集合)。
我想制作这样一个 API,在获取 id 参数后 returns 我是一个 user
表单 users
集合,其中填充了 field
属性而不是它在字段值中的 id field
。为此,我正在使用填充方法,但它不起作用。
这是显示 users
集合的屏幕截图:
这是显示 fields
集合的屏幕截图:
这是字段的架构(文件名 Field.js):
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var FieldSchema = new Schema(
{
_id: Schema.Types.ObjectId,
name: String,
price: Number,
_categories: [{
type: Schema.ObjectId,
}],
}
);
module.exports = mongoose.model('Field', FieldSchema);`
这是用户的架构和模型
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
_id: Schema.Types.ObjectId,
salt: String,
provider: String,
name: String,
email: {
type: String,
required: true
},
password: {
type: String,
required: true
},
_subscriptions: [{
field: {
type: mongoose.Schema.ObjectId,
ref: 'Field',
},
status: String,
dateSubscribed: Date,
payments: [{}]
}],
role: String,
});
module.exports = mongoose.model('User', UserSchema);
这是用户路由器的代码
var Field = require('../model/Field');
var express = require('express');
var router = express.Router();
var User = require('../model/User');
router.get('/',function(req, res, next) {
User.find({}, function(err, result) {
if (err) {
console.log(err);
res.send('something wrong');
}
res.status(200).send(result);
}).populate( '_subscriptions.field').exec(function (err, story) {
if (err) return handleError(err);
console.log('Here!!!!!');
});
});
router.get('/findById/:id',function(req, res, next) {
var id = req.params.id;
User.findById(id, function(err, doc) {
if (err) {
console.error('error, no entry found');
}
res.status(200).send(doc);
}).populate('field').exec(function (err, story) {
if (err) return handleError(err);
console.log('Here!!!!!');
});
});
router.get('/getSubscriptions/:id',function(req, res, next) {
var id = req.params.id;
User.findById(id, function(err, doc) {
if (err) {
console.error('error, no entry found');
}
var type = typeof(doc);
res.status(200).send(doc);
})
});
module.exports = router;
这是我调用 app.use 方法的地方:
这是我使用邮递员得到的回复
我期待有人帮助解决这个问题 因为我无法确定我的错误。非常感谢您在这方面的帮助。
提前致谢
我的理解是,在用户集合中,有_subscriptions
,在_subscriptions
中,有field
。如果这是您的架构,那么您应该将“_subscriptions.field
”作为参数传递给填充函数,而不是像您当前传递的那样传递“field
”。
因此,您的用户子路由代码 /findById/:id
必须如下所示:
router.get('/findById/:id',function(req, res, next) {
var id = req.params.id;
User.findById(id, function(err, doc) {
if (err) {
console.error('error, no entry found');
}
res.status(200).send(doc);
}).populate('_subscriptions.field').exec(function (err, story) {
if (err) return handleError(err);
console.log('Here!!!!!');
});
});