【问题标题】:Mongoose, upsert an item in array in referenced subdocumentMongoose,在引用的子文档中插入数组中的项目
【发布时间】: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


    【解决方案1】:

    您现在正在尝试更新与用户名匹配的UserModel,具有搁置名称,这就是upsert: true 创建新用户条目的原因。

    你应该做的是找到图书馆_id然后$push你要找的书架。

    【讨论】:

    • 所以,我只需要一个单独的查询来获取库的 _id 吗?
    • 是的,然后更新库。
    • 如果货架模型引用了它的库,我会有不同的情况,对吧?在那种情况下,我可以使用简单的 upsert
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 2016-12-14
    • 2021-01-10
    • 1970-01-01
    • 2017-09-17
    • 2016-12-09
    • 2018-01-26
    相关资源
    最近更新 更多