0

我正在尝试更新我的收藏

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

输入对象 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()
        }
    })
4

2 回答 2

2

您可以在单个查询中执行此操作,从 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'
            }
      }}}]
)
于 2020-05-08T08:57:24.753 回答
1

运算符不是像 if-then-else 那样的$cond流控制,它是一个返回值的表达式。

如果要根据同一文档中另一个字段的值有条件地更新一个字段,可以使用更新的管道形式,将$cond表达式的结果分配给该字段。

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'
            }
      }}]
)
于 2020-05-08T09:09:08.597 回答