使用Mongoose

时间:2018-11-19 15:06:37

标签: node.js mongodb express mongoose

我有一个带有嵌套对象的数据模型,我想使用主对象ID以及与嵌套对象相关联的日期和时间将“可用”字段更新为“保留”。这是我的数据...

{
"_id": {
    "$oid": "5bf1a675041f242cda138d1c"
},
"availability": [
    {
        "_id": {
            "$oid": "5bf2c077d5683c38afacf34b"
        },
        "date": "2018-12-20 ",
        "time": " 11:00 - 12:00 ",
        "status": "reserved"
    },
    {
        "_id": {
            "$oid": "5bf2c3bb8b95bd3a7cb3eabe"
        },
        "date": "2018-11-30",
        "time": "18:00 - 19:00",
        "status": "available"
    }
],
"name": "blah",
"price": 50,
"city": "blah",
"__v": 0
}

还有我正在尝试的代码...

router.get('/reserve/:id', function(req, res, next){

    //I've other stuff here that sets the correct variables according to the console.log, so str2[0] contains the date I want to find, etc.


        Pitch.findOneAndUpdate({
            id: req.params.id,
            'availability.date': 'str2[0]', //passing in 2018-11-30
            'availability.time': 'str2[1]', //passing in 18:00 - 19:00
            'availability.status': 'available'
        },
        {$set: {
            'availability.$.status': 'reserved'
            }
        })

但是,该对象不会更新,并且将状态设置为“已保留”。谁能发现我在做什么错?我应该尝试使用不同的条件访问特定对象吗?

编辑:经过反复试验,我认为问题是“查找”部分返回了父对象,并且返回了“可用性”数组中的所有子对象。 “更新”部分不知道要更新哪个“状态”,并且此刻失败。

我从前端的表单返回日期和时间,并认为我可以从其父ID加上保留的日期和时间来识别数组中的对象。

所以我想我的问题应该是,因为URL中返回的ID是父对象ID,是否有办法唯一地提取指定的可用性对象(例如5bf2c3bb8b95bd3a7cb3eabe)并将其状态更新为“保留”?

编辑2:我也可以通过它的“ availability._id”来“查找”一个项目,但是返回了完整的父对象,因此“更新状态”部分由于太宽而无法使用。

1 个答案:

答案 0 :(得分:0)

Pitch.findOneAndUpdate({
     id: req.params.id,
    'availability.status': 'available'
       },
   {$set: {
            'availability.$.status': 'reserved',
            'availability.$.date': 'str2[0]', //passing in 2018-11-30
            'availability.$.time': 'str2[1]', //passing in 18:00 - 19:00
        }
    })