我有一个PaymentCard和一个User模式,并希望在创建新的PaymentCard记录以将该特定卡链接到特定客户时定义现有用户的ID。它确实使用客户的mongoID创建了PaymentCard文档,但是使用.populate()查询不会在任何用户上返回任何卡,并在所有用户上返回空数组。
我的客户模式:
const Customer = new Schema({
name: {
type: String,
required: true
},
surname: {
type: String,
required: true
},
alias: String,
customerStatus: {
type: String,
enum: ['Regular', 'Valued'],
},
discount: {
type: String,
enum: ['Fixed', 'Flexible']
},
email: String,
phoneNo: String,
cards: [{
type: Schema.Types.ObjectId, ref: 'paymentcards'
}]
})
module.exports = mongoose.model('Customer', Customer )
我的PaymentCard模式:
const PaymentCard = new Schema({
owner: {
type: Schema.Types.ObjectID,
ref: 'customers'
},
nameOnCard: {
type: String,
required: true
},
cardNumber: {
type: String,
required: true,
unique: true,
minlength: 15,
maxlength: 16
},
cardIssuer: String,
cvc: Number,
exp: {
type: Number,
}
})
module.exports = mongoose.model('PaymentCard', PaymentCard)
我注册新卡并填充的功能:
router.post('/addPayment', (req, res, next) => {
jwt.verify(req.query.secret_token, process.env.JWT_SECRET, (err, decoded) => {
if (decoded.user.role == 'Advisor') {
PaymentCard.create({
owner: req.body.owner,
nameOnCard: req.body.nameOnCard,
cardNumber: req.body.cardNumber,
cardIssuer: req.body.cardIssuer,
cvc: req.body.cvc,
exp: req.body.exp
})
res.send('Registered successfully');
} else {
res.status(401).json({ message: 'Unauthorised' })
}
})
})
router.get('/getAll', (req, res, next) => {
jwt.verify(req.query.secret_token, process.env.JWT_SECRET, (err, decoded) => {
if (decoded.user.role == 'Manager' || 'Advisor') {
Customer.find({}, function (err, customers) {
res.send(customers);
}).populate('cards').exec((err, cards) => {
console.log("Populated User " + cards);
})
} else {
res.status(401).json({ message: 'Unauthorised' })
}
})
});
'PaymentCard'
而不是'paymentcards'
。1-N
关系,可以用猫鼬virtual properties解决。在您的Customer
模式上:
const Customer = new Schema({
...
});
Customer.virtual('cards', {
ref: 'PaymentCard',
localField: '_id',
foreignField: 'owner',
justOne: false
});
module.exports = ...
然后您可以使用.populate('cards')
获取虚拟内容
为了能够从用户中填充卡,您需要在创建付款时将卡ID推送到用户卡阵列。但我在您的addPayment
中看不到该逻辑。
此外,正如已经提到的,您需要更正用户模式,对于用户模式中的卡,引用必须为"PaymentCard"
。 (对于PaymentCard,您需要将客户的参考更正为"Customer"
)
为了简单起见,我将排除jwt.verify部分,并描述我的解决方案。
正如我已经说过的,您需要将创建的卡ID保存到用户的卡数组中:
router.post("/addPayment", async (req, res) => {
try {
const result = await PaymentCard.create(req.body);
const customerId = req.body.owner;
const response = await Customer.findByIdAndUpdate(
customerId,
{
$push: { cards: result._id } //result._id has the value of newly created card
},
{ new: true }
);
res.send(response);
} catch (err) {
console.log(err);
res.status(500).send("Something went wrong");
}
});
假设您有这个没有任何卡的客户:
{
"cards": [],
"_id": "5e823f6f76322539e0fb1668",
"name": "John",
"surname": "Smith",
"customerStatus": "Regular",
"email": "[email protected]",
"phoneNo": "123123123",
"__v": 0
}
当我们在邮寄路线中添加卡时,该客户将是这样:
{
"cards": [
"5e82400776322539e0fb1669"
],
"_id": "5e823f6f76322539e0fb1668",
"name": "John",
"surname": "Smith",
"customerStatus": "Regular",
"email": "[email protected]",
"phoneNo": "123123123",
"__v": 0
}
添加的卡文件为:
{
"owner": "5e823f6f76322539e0fb1668",
"nameOnCard": "John Smith",
"cardNumber":"1234123412341234",
"cardIssuer": "VISA",
"cvc": 123,
"exp": 202008
}
现在您可以像这样填充用户卡:
router.get("/getAll", async (req, res) => {
try {
const customerId = "5e823f6f76322539e0fb1668";
const result = await Customer.findById(customerId).populate("cards");
res.send(result);
} catch (err) {
console.log(err);
res.status(500).send("Something went wrong");
}
});
这将为您提供以下结果:
{
"cards": [
{
"_id": "5e82400776322539e0fb1669",
"owner": "5e823f6f76322539e0fb1668",
"nameOnCard": "John Smith",
"cardNumber": "1234123412341234",
"cardIssuer": "VISA",
"cvc": 123,
"exp": 202008,
"__v": 0
}
],
"_id": "5e823f6f76322539e0fb1668",
"name": "John",
"surname": "Smith",
"customerStatus": "Regular",
"email": "[email protected]",
"phoneNo": "123123123",
"__v": 0
}