首页 > 解决方案 > $push 和 $set 在同一个更新查询中,条件为 $cond pymongo mongodb

问题描述

我正在尝试更新我的收藏

对于单,对象需要更新状态和更新时间。

输入对象 id 作为id新状态作为当前status

Condition 如果与in DBnew status不同status,则需要$push new statustimestampactivity_log数组。并更新记录的更新updated_timestatus

如果new status和之前的状态相同,那么updated_time将被更新。

是否可以在 pymongo 中使用单一更新来做到这一点?

collection.update({
        '_id': ObjectId(id),
    }, {
        '$cond': {
            'if': {
                'status': {
                    '$ne': current_status
                }
            },
            'then': {
                '$push': {
                    'activity_log': {
                        'status': current_status,
                        'changed_time': datetime.now()
                    }
                }
            },
            'else': None
        },
        '$set': {
            'status': current_status,
            'updated_time': datetime.now()
        }
    })

标签: pythonmongodbnosqlpymongomongodb-update

解决方案


您可以在单个查询中执行此操作,从 MongoDB 4.2 更新查询支持聚合管道,您可以按照以下代码执行此操作

collection.update(
     {'_id': ObjectId(id)}, 
     [{'$set': {
            'status': current_status,
            'updated_time': datetime.now(),
            'activity_log':{
              '$cond': {
                'if': {'$ne': ['$status',current_status]},
                'then': {$concatArrays:['$activity_log',[
                          {
                           'status': current_status,
                           'changed_time': datetime.now()
                          }
                ]]},
                'else': '$activity_log'
            }
      }}}]
)

推荐阅读