node.js - Mongoose,在引用的子文档中插入数组中的项目
问题描述
我有以下模式和模型:
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 中的查询,如果它没有找到具有该名称的架子的用户,它会尝试创建一个新用户,复制用户名。
我是否正确假设我必须将第一个查询分成两部分,“在库中查找具有该名称的书架的用户”,以防找不到“在库中创建该书架”?
或者是否有可能以某种方式统一查询?
解决方案
您现在正在做的是尝试更新UserModel
与用户名匹配的 a,具有搁置名称,这就是upsert: true
创建新用户条目的原因。
您应该做的是找到图书馆_id
,然后将书$push到您正在搜索的书架上。
推荐阅读
- sql - 优化 DRF 序列化
- arrays - 如何让我的 Google 表单管理面试委员会的独特问题?
- typescript - 定义类型字符串 | 在字符串数组类型中未定义
- node.js - NPM 模块解析问题
- python-3.x - 需要帮助升级多维 Pytorch 张量
- microsoft-graph-api - 如何正确地将邮件文件夹从一个邮箱移动到另一个邮箱?
- html - React - HTML 输入不会禁用动态
- docker-compose - 在 Gitlab-ci 中使用带有 docker-compose 的 Testcontainers 运行端到端测试
- javascript - 想要显示不同的文本和数组几秒钟
- python - 如何总结循环内的值?