python - $push 和 $set 在同一个更新查询中,条件为 $cond pymongo mongodb
问题描述
我正在尝试更新我的收藏
对于单,对象需要更新状态和更新时间。
输入对象 id 作为id
新状态作为当前status
Condition 如果与in DBnew status
不同status
,则需要$push
new status
和timestamp
成activity_log
数组。并更新记录的更新updated_time
和status
。
如果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()
}
})
解决方案
您可以在单个查询中执行此操作,从 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'
}
}}}]
)
推荐阅读
- python - 如何读取一个 Numpy 数组并从另一个 Numpy 数组中获取值
- reactjs - 如何为 redux 动作生成器编写动作?
- asp.net-core - 如何在 .Net Core Identity 中强制执行 2FA?
- android - 如何在 xml 和 kotlin 组合中创建类似布局的计算器
- python-3.x - Python:您能否根据用户输入的 int 的索引显示单个 int
- android - 如何在 Android Studio 中升级 http 依赖
- python - 在 Tensorflow 中使用 deltaE_ciede2000 查找颜色距离
- python - 如何在python的框架(tkinter)内的标签中显示我的覆盆子凸轮?
- google-sheets - 如何计算 Google 表格单元格中文本的出现次数?
- sql - Oracle分层查询数据