#javascript #node.js #mongodb #mongoose
Вопрос:
Объяснение
Я создаю vpn-приложение и пытаюсь смоделировать заказ с помощью планов. Каждый заказ имеет массив планов виртуальных полей. Когда план создается, он должен ссылаться на заказ, чтобы заполнение работало. Я знаю, что могу ограничить количество планов, показываемых при заполнении, но я хочу ограничить количество планов, созданных для каждого заказа, чтобы остановить спам. Поэтому, если ограничение составляет 10 планов, если кто-то попытается создать 11-й план с той же ссылкой на заказ, это приведет к ошибке.
образец:
- Пользователь создает и заказывает с идентификатором: 1
- Пользователь создает 10 планов с идентификатором заказа:1
- С заказом связано 10 планов
- Пользователь пытается создать другой план с идентификатором заказа: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. Это работает, но мне все еще не нравится идея запрашивать дважды. Если к концу дня не будет лучшего ответа, я отмечу это как ответ. Спасибо!