Как ограничить создание документов с одной и той же родительской ссылкой

#javascript #node.js #mongodb #mongoose

Вопрос:

Объяснение

Я создаю vpn-приложение и пытаюсь смоделировать заказ с помощью планов. Каждый заказ имеет массив планов виртуальных полей. Когда план создается, он должен ссылаться на заказ, чтобы заполнение работало. Я знаю, что могу ограничить количество планов, показываемых при заполнении, но я хочу ограничить количество планов, созданных для каждого заказа, чтобы остановить спам. Поэтому, если ограничение составляет 10 планов, если кто-то попытается создать 11-й план с той же ссылкой на заказ, это приведет к ошибке.

образец:

  1. Пользователь создает и заказывает с идентификатором: 1
  2. Пользователь создает 10 планов с идентификатором заказа:1
  3. С заказом связано 10 планов
  4. Пользователь пытается создать другой план с идентификатором заказа:1, но не удается

Вот моя схема заказов:

 const orderSchema = new mongoose.Schema(
  {
    user: {
      type: mongoose.Schema.ObjectId,
      ref: "User",
      required: [true, "Please provide a user for this order"],
    },
    //... other fields
  }
);

// This is the array of plans connected to this order
orderSchema.virtual("plans", {
  foreignField: "order",
  localField: "_id",
  ref: "Plan",

});
 

Вот моя схема:

 const planSchema = new mongoose.Schema(
  {
    user: {
      type: mongoose.Schema.ObjectId,
      required: [true, "Please provide a user for this plan"],
      ref: "User",
    },
    order: {
      type: mongoose.Schema.ObjectId,
      required: [true, "Please provide an order to process this plan"],
      ref: "Order",
    },
    type: {
      type: String,
      enum: {
        values: ["oneMonth", "sixMonth", "oneYear"],
        message: "Plan type must be one of the following: 'oneMonth', 'sixMonth', 'oneYear'",
      },
      required: [true, "Please provide the type of plan"],
    },
    //... other fields
  }
);
 

Дополнительные мысли:
Может ли быть какой-то индекс, который ограничивает поле заказа 10 одинаковыми? Если нет, то все в порядке, мне просто нужно решение этой проблемы, спасибо.

Комментарии:

1. не могли бы вы предоставить какой — нибудь образец

2. Я просто добавил это

3. вы хотите реализовать с node.js или монгодб ?

4. нодеи и мангуст

Ответ №1:

перед добавлением нового плана в заказ вы должны отправить запрос в plan коллекцию, чтобы найти номер плана с идентификатором заказа и идентификатором пользователя, если число меньше 10, добавьте новый план 1 — запрос для поиска пользователя и идентификатора заказа 2 — если количество планов меньше 10, создайте еще, верните false

 app.post('/create',(req,res)=>{
var numberOfPlans = await plans.find({user:userId,order:orderId}).countDocuments()
if (numberOfPlans < 10) {
   plans.create({data})
   res.json({status:true})
}
else {
res.json({status:false})
}
})
 

Комментарии:

1. Я понимаю, как это может сработать, но не вызовет ли это проблем с производительностью, так как каждый раз, когда вы что-то создаете, оно отправляет два запроса?

2. поэтому добавьте новую схему для сбора userId , «Планы Numberoforder», это так быстрее

3. Я понимаю. Я попробую это сделать.

4. Это работает, но мне все еще не нравится идея запрашивать дважды. Если к концу дня не будет лучшего ответа, я отмечу это как ответ. Спасибо!