【问题标题】:Mongoose, $pull an element from nested array and update document based on the presence of the elementMongoose,$从嵌套数组中拉出一个元素并根据元素的存在更新文档
【发布时间】:2020-11-01 03:09:43
【问题描述】:

我正在研究类似于此的猫鼬模式:

const actionSchema = {
    actions: {
        type: [{
            actionName: {
                type: String,
                required: true
            },
            count: {
                type: Number,
                default: 0,
                required: true
            },
            users: [{
                type: Schema.Types.ObjectId,
                ref: 'User'
            }]
        }]
    }};

它是 post 模式的嵌套模式。 在这里,动作是动态生成的,执行该动作的人数由 count 维护,他们的身份由 users 数组维护。

如您所见,actions 是一个对象数组,其中还包含 users 数组。 我想检查提供的用户 ID 是否存在于任何操作对象中,然后将其从数组中删除并减少计数。

对于 mongoose 和 mongodb 来说是全新的,我看到的一种简单方法是使用必须更新的 Post.findById() 查找帖子,运行 js 循环,更新帖子并调用 .save()。但是当 users 数组有数千个用户 ID 时,它可能会非常昂贵。 我试过.update(),但不明白在这种情况下如何使用它。

向 Post 模型添加一个方法(如 postSchema.methods.removeUserAction)怎么样?这允许从this 访问文档并允许更新文档并因此调用.save()。它是否将完整的文档加载到客户端节点应用程序?

所以请提出正确的方法。 谢谢。

【问题讨论】:

    标签: javascript node.js arrays mongodb mongoose


    【解决方案1】:

    你应该简化你的模型,例如

    // Model - Actions Model
    
    const actionSchema = {
       actionName: {
           type: String,
           required: true
       },
       user: {
           type: Schema.Types.ObjectId,
           ref: 'User'
       }
    };
    

    您可以通过Model.count() 轻松获取总操作数,使用Model.count({ actionName: 'action name'}) 获取特定操作计数,并使用Model.delete(condition) 删除条目。除非有理由让您以这种方式建模。

    【讨论】:

    • 我当然可以删除“计数”,但是,由于 actionSchema 是后期模型的嵌套模式,我宁愿将这个新的 actionSchema 嵌套为一个数组。例如:actions: [actionSchema]
    • 好吧,只要您确定文档不会超出允许的 MongoDB 文档大小限制。您只需要执行 $push 或 $pull 来添加或删除操作数组中的条目。
    • @NeetigyaChahar 如果对您有用,请投票并接受答案。它也将有助于您的声誉。 :)
    • 我仍有疑问。我已经创建了这个架构。但是要获得每个操作的用户数,我需要使用.aggregate(){$group: {...}。另外要加载每个帖子,我需要进行两个查询。一个用于操作及其计数,另一个用于加载其他详细信息。由于这是针对社交媒体网站的,因此每个帖子可能会在几秒钟内加载多次。所以我想这大大增加了数据库的成本。这就是为什么我想要count 字段以便一次性加载带有动作计数的帖子详细信息。采取行动时,我会更新计数。我只是需要你的建议。
    • 这个架构终于帮到了我。谢谢。
    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 2015-12-22
    • 2018-07-12
    • 2018-12-14
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多