如何更新 MongoDB 中的数组元素而不是创建新元素

Posted

技术标签:

【中文标题】如何更新 MongoDB 中的数组元素而不是创建新元素【英文标题】:How to update array elements in MongoDB instead of creating new one 【发布时间】:2019-04-21 21:33:21 【问题描述】:

我的代码有问题。我想更新文档,如下所示:

    
"_id": 
    "$oid": "5bf2ad5a0d46b81798232cf9"
,
"manufacturer": "VW",
"model": "Golf ",
"VIN": "WVWZZZ1J212566691",
"doors": 3,
"class": "compact",
"reservations": [
    
        "_id": 
            "$oid": "5bf2ad5a0d46b81798232cfa"
        ,
        "pick_up_date": 
            "$date": "2014-10-13T09:13:00.000Z"
        ,
        "drop_off_date": 
            "$date": "2014-10-14T09:13:00.000Z"
        ,
        "user_id": 
            "$oid": "5bec00bdfb6fc005dcd5423b"
        
    
],
"createdAt": 
    "$date": "2018-11-19T12:32:26.665Z"
,
"updatedAt": 
    "$date": "2018-11-19T12:32:26.665Z"
,
"__v": 0
  

我想向数组 Reservations 添加新的预订。我的功能:

const createReservationForCarId = ( body , params , res, next) =>
    Carmodel.findById(params.id)
        .then(notFound(res))
        .then((carmodel) => carmodel ? Object.assign(carmodel, body).save() : null)
        .then((carmodel) => carmodel ? carmodel.view(true) : null)
        .then(success(res))
        .catch(next)

但是当我尝试通过以下方式更新时:

router.put('/:id/reservation',
    createReservationForCarId)

主体:



    "reservations":[

    

        "pick_up_date" : "October 13, 2017 11:13:00",  
        "drop_off_date": "October 14, 2017 11:13:00",
        "user_id":"5bec00bdfb6fc005dcd5423b"

    
    ]

Mongo 不是更新我的旧文档,而是创建一个新文档,而上面的正文中只给出了一个保留。

我应该怎么做才能只更新现有文档而不创建新文档?

【问题讨论】:

docs.mongodb.com/manual/reference/method/db.collection.update @Ferus7 看看下面的评论。 【参考方案1】:

您可以在代码中尝试使用 findAndModify 而不是 findById。查看语法here

【讨论】:

我已经修改了我的方法并将findById()更改为findByIdAndUpdate(),但是现在它修改了现有文档,详细说明了现有数组对象在预订。我想向数组添加新对象,不修改现有的。 mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate 如何解决这个问题? @Susmita Bhattacharjee 您可以使用 $push 属性将新元素附加到您的预留数组中。看看this 接受的答案。在此示例中,尝试将 "$push": "childrens": employee._id 替换为 "$push": "reservations": "newelement1": "newvalue1", "newelement2":"newvalue2" 【参考方案2】:

我没有使用过 mongoose,但他们有数组操作的文档。

请看这里: https://mongoosejs.com/docs/api.html#mongoosearray_MongooseArray-push

这里还有用于数组操作的相关 mongo 文档: https://docs.mongodb.com/manual/reference/operator/update/push/

【讨论】:

【参考方案3】:

我建议你使用 Mongoose 的 $push 操作符,它会将你的对象附加到现有数组中,并且不会创建一个新数组。

查看此链接:- https://github.com/Automattic/mongoose/issues/4338

【讨论】:

以上是关于如何更新 MongoDB 中的数组元素而不是创建新元素的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一个字段更新 mongodb 中的数组 dict 元素

mongodb更新数组中的单个对象

获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)

如何将数组中的元素向右移动?

在 swift 3 中使用 .append() 时,数组中的元素被替换,而不是数组获得新元素

更新 MongoDB 中精确元素数组中的字段