首页 > 解决方案 > 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 中的查询,如果它没有找到具有该名称的架子的用户,它会尝试创建一个新用户,复制用户名。
我是否正确假设我必须将第一个查询分成两部分,“在库中查找具有该名称的书架的用户”,以防找不到“在库中创建该书架”?
或者是否有可能以某种方式统一查询?

标签: node.jsarraysmongodbmongooseupsert

解决方案


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

您应该做的是找到图书馆_id,然后将书$push到您正在搜索的书架上。


推荐阅读