推入 Mongoose 数组不会更新数组

Posted

技术标签:

【中文标题】推入 Mongoose 数组不会更新数组【英文标题】:Pushing into Mongoose array is not updating the array 【发布时间】:2020-12-12 13:25:57 【问题描述】:

我有一个包含集合对象的集合属性的用户模式。这些集合对象有一个名为 items 的属性,它是一个对象数组。

//User Schema
const UserSchema = new mongoose.Schema(
    username: 
        type: String,
        required : true,
    ,
    password: 
        type: String,
        required: true
    ,
    collections: [type : mongoose.Schema.Types.ObjectId, ref: 'Collection']
); 

//Collection Schema 
const CollectionSchema = new mongoose.Schema(
    items : [type : mongoose.Schema.Types.ObjectId, ref: 'Item']
); 

//Item Schema

const ItemSchema = new mongoose.Schema(
    title: 
        type: String,
        required: true
); 

使用下面的代码,我尝试创建一个新的项目架构并将其推送到第一个集合对象中。我使用 findById 函数传递了要更新的集合对象的 _id。在找到带有我的 id 的集合后,我只需将 Item Schema 推送到集合对象的 items 数组中。我得到 res.status(200) 但我的 items 数组从未更新。还有其他人有这个问题吗?谢谢你的帮助。

userRouter.post('/addItem', passport.authenticate('jwt', session: false), (req, res) => 
    const item = new Item(req.body)

    item.save(err => 
        if(err)
            res.status(500).json(message: msgBody: "Error has occured", msgError: true );
        else 
            Collection.findById(req.body.search, function(err, coll)
                coll.items.push(item);
                req.user.save(err => 
                    if(err)
                        res.status(500).json(err)
                    else
                        res.status(200).json(coll)
                    
                )
            )
        
    )
);

【问题讨论】:

【参考方案1】:

您不会使用数据库中新创建的 Item 文档对 Collection 执行任何更新操作。

使用 $addToSet 运算符 (https://docs.mongodb.com/manual/reference/operator/update/addToSet/) 将创建的 Item 文档添加到 Collection 中的 items 属性(我建议使用 mongoose findByIdAndUpdate 方法或 updateOne 方法)。

使用回调会是这样的:

Collection.findByIdAndUpdate(req.body.search,  $addToSet: items: item._id, callback);

如果您有多个 Item 文档需要插入到 Collection 中,您可以将 $addToSet 与 $each 运算符 (https://docs.mongodb.com/manual/reference/operator/update/each/) 结合使用。

【讨论】:

以上是关于推入 Mongoose 数组不会更新数组的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 不更新 mongodb 中的数组

推入 mongoose 对象内部的数组

将对象推入 Mongoose 中的数组模式

Mongoose:将字符串推入数组

Mongoose/Node:将元素推入数组类型的文档字段?

Mongoose:通过 findOneAndUpdate 查询使用对象数组的总和更新根数据属性不起作用