gpt4 book ai didi

javascript - 更新引用另一个模型的属性而不重复

转载 作者:行者123 更新时间:2023-12-03 05:53:59 25 4
gpt4 key购买 nike

我正在尝试创建一个事件列表,用户可以在其中添加自己或从事件中删除自己,并指定他们是否携带客人参加该事件。

所以我有一个事件模式和一个用户模式,其中事件模式引用用户模式。因此,当创建新事件时,用户可以使用自己的 ID 将自己添加到该事件中。

现在我正在尝试让用户也可以包含访客。我如何实现这一目标?

这是一个例子

用户架构:

let UserSchema = new mongoose.Schema({
email: {
type: String,
lowercase: true,
unique: true,
required: true
},
name:{
type: String,
require: true
},
password: {
type: String,
required: true
},
...

事件架构:

let EventSchema = new mongoose.Schema({
date: {
type: Date,
unique: true,
timestamps: true,
required: true
},
title: {
type: String,
require: true
},
// Guest property is ignored
attending: [{
type: mongoose.Schema.Types.ObjectId,
guest: Number, //This is being ingored and never updated
ref: 'User'
}]
})

在架构中定义相关部分的第二种方法:

...
//In this example the guest will be added but duplicates will occur
user:[{
guest: Number, // To make it clear this is not referencing anything it's just a number
attending: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
}]

如何在上述配置中使用 addToSet 更新类型和 guest 属性(以防止重复)?

Event.findOneAndUpdate({_id:req.body.eventId}, query) 

最佳答案

我认为您不了解 Mongoose 模式的工作原理,您可能需要花更多时间在他们的文档上。

您提供的代码似乎是架构中名为 Events 的字段,它是一个对象数组,其中每个对象都有一个名为 attending 的字段code>,它本身必须是 ObjectId 类型并引用“User”集合。字段定义上还有一个 guest 属性,Mongoose 将忽略该属性,因为它不理解您所要求的内容。

认识到这个数据结构是什么,是向 Mongoose 指示如何验证和保存数据的说明。对于大多数应用程序来说,它通常不会在运行时更新,也不会直接存储数据,同样,它的目的是向 Mongoose 提供关于您希望如何存储数据的线索。

/** 根据评论和更新的问题进行编辑 **/

正如我之前所说,您不能直接将另一个字段嵌入到字段的定义中。您可以做的是创建一个包含这两种信息的混合类型,但这需要您在某种程度上自己管理事物。

let EventSchema = new mongoose.Schema({
date: {
type: Date,
unique: true,
timestamps: true,
required: true
},
title: {
type: String,
require: true
},

attendees: [{
user : {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
guests : Number
}]
})

每当有人添加到出席列表中时,您都需要调用 event.markModified() 以确保其得到保存。如果您不想允许重复的用户,您还需要进行检查。确保发生这种情况的一种方法是在获取事件时 populate() 该字段,然后仅在本地检查匹配项。

/** 编辑 #2 **/

您还可以显式创建另一个架构来“保存”您的用户和 # 位客人信息,然后这将创建 Mongoose 将监视的模型,并且您可以通过正常的 Mongoose 方法对它们应用验证,而不必担心脏检查。看起来像这样:

// in ./models/attendee.js
let AttendeeSchema = new Schema({
user : {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
unique : true
},
guests : Number
}

mongoose.model('Attendee', AttendeeSchema);

// in your Events definition
let Attendee = mongoose.model('Attendee');
let EventSchema = new mongoose.Schema({
date: {
type: Date,
unique: true,
timestamps: true,
required: true
},
title: {
type: String,
require: true
},
attendees: [Attendee]
})

/** 编辑 3:现在,带有查询 **/

要在给定现有事件和已知用户的情况下插入新与会者:

event.attendees.push(new Attendee({user: user, guests: 5}));
event.save(console.log);

要更新现有与会者,您需要先找到您要查找的与会者:

let attendee = event.attendees.find((attendee) => { return attendee._id.toString() === user._id.toString(); }); 
attendee.guests = 10;
event.save(console.log);

关于javascript - 更新引用另一个模型的属性而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40021584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com