猫鼬populate()无法正常工作

问题描述 投票:0回答:2

我有一个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' })
    }
  })
});

node.js mongodb express mongoose mongoose-populate
2个回答
0
投票
  1. 引用应该是模型而不是基础集合,因此在这种情况下是'PaymentCard'而不是'paymentcards'
  2. 由于您要建立一个无界的1-N关系,可以用猫鼬virtual properties解决。

在您的Customer模式上:

const Customer = new Schema({
...
});


Customer.virtual('cards', {
  ref: 'PaymentCard',
  localField: '_id',
  foreignField: 'owner',
  justOne: false
});

module.exports = ...

然后您可以使用.populate('cards')获取虚拟内容


0
投票

为了能够从用户中填充卡,您需要在创建付款时将卡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
}
© www.soinside.com 2019 - 2024. All rights reserved.