Каков наилучший подход для ссылки на objectIds плюс дополнительные параметры в схеме? - PullRequest
0 голосов
/ 10 ноября 2019

Я создаю схему для модели Заказа, которая будет отслеживать заказанные товары вместе с приобретенным количеством. Я хочу, чтобы ссылки на itemId и количество были связаны в виде массива в одном параметре.

Я создал массив, который включает ссылку на ObjectId плюс дополнительный тип Number. В настоящее время я не могу заполнить информацию о продукте с помощью запроса .populate ().

Схема заказа

const mongoose = require("mongoose");
const { Schema } = mongoose;

const orderSchema = new Schema({
  orderNumber: String,
 _itemsOrdered: [
    {
      itemId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "menuItems"
      },
      quantity: Number
    }
  ]
});

mongoose.model("orders", orderSchema);

Схема MenuItem

const mongoose = require("mongoose");
const { Schema } = mongoose;

const MenuItemSchema = new Schema({
  imageURL: String,
  name_en: String,
  name_es: String,
  type_en: String,
  type_es: String,
  description_en: String,
  description_es: String,
  dietaryCallouts: [String],
  price: Number
});

mongoose.model("menuItems", MenuItemSchema);

module.export = MenuItemSchema;

Я могу сохранитьзапись, но не может заполнить информацию MenuItem следующим запросом:

Контроллер заказов

  async show(req, res, next) {
    try {
      const orderId = req.params.id;

      let order = await Order.findById({ _id: orderId }).populate(
        "_itemsOrdered.itemId"
      );

      res.send(order);
    } catch (err) {
      res.status(402).send(err);
    }
  }

Здесь это объект заказа, который сохраняется в БД.

ЗаказОбъект

{
    "_id": "5dc93b9c0085b8045e0c8aa3",
    "orderNumber": "Order 3",
    "_itemsOrdered": [
        {
            "_id": "5dc93b9c0085b8045e0c8aa5",
            "itemId": "5dc7f814a2679b47319a79a4",
            "quantity": 1
        },
        {
            "_id": "5dc93b9c0085b8045e0c8aa4",
            "itemId": "5dc7e5c7de590744c46f93da",
            "quantity": 2
        }
    ],
    "__v": 0
}

1 Ответ

1 голос
/ 10 ноября 2019

Ваша схема заказа должна быть такой:

const orderSchema = new Schema({
  orderNumber: String,
  _itemsOrdered: [
    {
      itemId: { type: mongoose.Schema.Types.ObjectId, ref: "menuItems" },
      quantity: Number
    }
  ]
});

И вы можете использовать следующий маршрут для создания документа заказа.

router.post("/order", async (req, res, next) => {

  try {
    const { orderNumber, _itemsOrdered } = req.body;

    let order = new Order({ orderNumber, _itemsOrdered });
    order = await order.save();

    res.status(201).send(order);

  } catch (err) {
    console.log(err);
    res.status(500).send(err);
  }
});

Пример тела: (вам нужно изменитьидентификаторы в соответствии с вашими)

{
    "orderNumber": "Order 1",
    "_itemsOrdered": [
        {"itemId": "5dc90346222b892434e4675a", "quantity" : 1 }, 
        {"itemId": "5dc90359222b892434e4675b", "quantity" : 2 }
    ]
}

Чтобы получить заказ и его предметы, которые вы можете использовать, заполните следующим образом:

router.get("/orders/:id", async (req, res) => {
  try {
    const orderAndItems = await Order.findById(req.params.id).populate(
      "_itemsOrdered.itemId"
    );

    res.send(orderAndItems);
  } catch (err) {
    console.log(err);
    res.status(500).send(err);
  }
});

Это даст вам такой результат:

{
    "_id": "5dc904db8407a217b4dfe6f4",
    "orderNumber": "Order 1",
    "_itemsOrdered": [
        {
            "_id": "5dc904db8407a217b4dfe6f6",
            "itemId": {
                "_id": "5dc90346222b892434e4675a",
                "name_en": "item 1",
                "price": 1,
                "__v": 0
            },
            "quantity": 1
        },
        {
            "_id": "5dc904db8407a217b4dfe6f5",
            "itemId": {
                "_id": "5dc90359222b892434e4675b",
                "name_en": "item 2",
                "price": 2,
                "__v": 0
            },
            "quantity": 2
        }
    ],
    "__v": 0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...