Пн goose заполнить () не работает должным образом - PullRequest
0 голосов
/ 30 марта 2020

У меня есть схема PaymentCard и User, и я хочу определить идентификатор существующего пользователя при создании новой записи PaymentCard, чтобы связать эту карту c с указанным c клиентом. Он создает документ PaymentCard с mongoID клиента, однако запрос с помощью .populate () не возвращает карты ни одному из пользователей и возвращает пустые массивы всем пользователям.

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Чтобы иметь возможность заполнять карты от пользователя, вам нужно указать sh идентификатор карты в массиве пользовательских карт при создании платежа. Но я не вижу этой логики c в вашей addPayment.

Кроме того, как уже упоминалось, вам нужно исправить свою пользовательскую схему, для карт в пользовательской схеме ссылка должна быть "PaymentCard". (А для PaymentCard вам нужно исправить ref для клиента на "Customer")

Чтобы упростить задачу, я исключу части jwt.verify и опишу свое решение.

Как Я уже сказал, вам нужно сохранить идентификатор созданной карты в массиве карт пользователя:

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": "john@test.com",
    "phoneNo": "123123123",
    "__v": 0
}

Когда мы добавляем карта с нашим почтовым маршрутом, этот клиент будет выглядеть так:

{
    "cards": [
        "5e82400776322539e0fb1669"
    ],
    "_id": "5e823f6f76322539e0fb1668",
    "name": "John",
    "surname": "Smith",
    "customerStatus": "Regular",
    "email": "john@test.com",
    "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": "john@test.com",
    "phoneNo": "123123123",
    "__v": 0
}
0 голосов
/ 30 марта 2020
  1. Ссылка должна быть на модель, а не на базовую коллекцию, поэтому в данном случае на 'PaymentCard', а не 'paymentcards'.
  2. Поскольку вы собираетесь на неограниченное 1-N отношение это можно решить с помощью mon goose виртуальных свойств .

В вашей Customer схеме:

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


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

module.exports = ...

И тогда вы можете использовать .populate('cards') чтобы получить содержимое виртуального

...