mongodb - 对空数组使用 $push
问题描述
我有一个 mongo 文档,其中包含名为“events”的数组字段。
该字段有时可以为空。
我正在使用$push
将元素添加到“事件”数组。问题是,当“事件”字段为空时它不能工作
例如,如果在数据库中,它看起来像这样:
{
"_id" : ObjectId("4d2d8deff4e6c1d71fc29a07"),
"user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0",
"events" : null
}
我用 $push 运行更新:
{ $push : { "events" : { "profile" : 10, "data" : "X"}}};
它将失败,因为事件为空。
我可以使用 2 个查询数据库的步骤来解决这个问题。但是,我可以在 1 个查询中完成吗?
如果数组字段不为空,我想将事件添加到数组中,但如果为空,则首先创建“事件”空数组,然后将事件添加到数组中。
解决方案
从 MogoDB 4.2 开始,您可以使用Updates with Aggregation Pipeline。这允许将更新作为单个操作执行。
var OBJ_TO_ADD = { "profile": 10, "data": "X" }
db.test.updateOne(
{ "_id" : ObjectId("4d2d8deff4e6c1d71fc29a07") },
[
{
$set: {
events: {
$ifNull: [
{ $concatArrays: [ "$events", [ OBJ_TO_ADD ] ] },
[ OBJ_TO_ADD ]
]
}
}
}
]
)
推荐阅读
- python - 简单的热图,其中 2 个 1D 列作为 x 和 y 轴,1 个 1D 列作为 z 轴
- r - 如何重塑具有三行标题的excel表以整理数据格式?
- reactjs - 如何使用 AsyncSelect 设置“react-select”以正确处理服务器端数据?
- reactjs - 如何在 React 的脚本标签中动态插入和运行代码
- selenium - 如何维护 HTML 定位器以实现自动化
- android - 我应该从同一个文件中读取和写入吗?
- android - 使用 Retrofit 和 DisposableSingleObserver 获取数据后 notifyDataSetChanged() 不起作用
- discord.py - 在机器人重启或崩溃 discord.py 的情况下如何触发事件
- circleci - 如何使自定义命令始终使用`when:always`运行
- c++ - 有符号整数溢出导致的未定义行为是否有任何限制?