【发布时间】:2021-12-21 22:55:22
【问题描述】:
我有以下架构和模型:
const shelfSchema = new mongoose.Schema({
name: {
type: String,
required: true,
default: 'New Shelf'
},
books: {
type: [bookSchema],
required: false
}
}, {autoCreate: false})
const shelfModel = mongoose.model('Shelf', shelfSchema)
const librarySchema= new mongoose.Schema({
shelves: {
type: [shelfSchema],
required: false,
}
})
const libraryModel = mongoose.model('library', librarySchema)
const userSchema = new mongoose.Schema({
username: {
type: String,
required:true,
unique:true
}
library: {
type: mongoose.Schema.Types.ObjectId,
ref: 'library',
required: true
}
})
const userModel = mongoose.model('User', userSchema );
每个用户都有一个唯一的用户名和图书馆参考资料,每个图书馆都有一个或多个书架,每个书架都有一本或多本书籍。
当我添加一本书时,我还传递了我想要插入该书的书架名称的信息,如果缺少该名称的书架,则应该创建它。
由于我来自 sql 心态,我很难理解是否可以以同样的方式管理 upsert。
我认为我最多可以使用两个查询插入这本书:一个是在它丢失时创建自我,另一个是将书插入书架。
当时我的方法是使用
UserModel.findOneAndUpdate({username: user.username, "library.shelves.name": shelfName},{}, {upsert: true})
但由于它是 UserModel 中的查询,如果它没有找到具有该名称的架子的用户,它会尝试创建一个新用户,复制用户名。
我是否正确假设我必须将第一个查询分成两部分,“在库中查找具有该名称的书架的用户”,以防找不到“在库中创建该书架”?
或者是否有可能以某种方式联合查询?
【问题讨论】:
标签: node.js arrays mongodb mongoose upsert