arrays - 在特定的多维 mongoDb 集合上推送对象
问题描述
我对 mongoDb 查询语言相当陌生,我正在为以下场景而苦苦挣扎。
我们有一个多维数据集,包括:
- n 个用户
- 每个用户的 n 个项目
- 每个项目的 n 个时间条目
我想要实现的是:我想使用 collection.update 推送/更新特定项目的 time_entry。
注意每个 pid 对于用户来说应该是唯一的
我使用的集合结构如下所示:
{
"_id" : ObjectId("5d6e33987f8d7f00c063ceff"),
"date" : "2019-01-01",
"users" : [
{
"user_id" : 1,
"projects" : [
{
"pid" : 1,
"time_entries" : [
{
"duration" : 1,
"start" : "2019-08-29T09:54:56+00:00"
}
]
},
{
"pid" : 2,
"time_entries" : []
}
]
},
{
"user_id" : 2,
"projects" : [
{
"pid" : 3,
"time_entries" : []
}
]
}
]
}
我目前可以使用以下方式更新给定用户的所有项目:
"users.$.projects.$[].time_entries"
但是我无法针对特定项目,因为该结构包含 2 个嵌套级别并且在 MongoDb 中还不允许使用多个 $ 位置运算符。
"users.$.projects.$.time_entries"
以下是我的完整查询示例:
db.times.update(
{ 'users' : { $elemMatch : { 'projects' : { $elemMatch : { 'pid' : 153446871 } } } } },
{ "$push":
{
"users.$.projects.$[].time_entries":
{
"duration" : 5,
"start" : "2019-08-29T09:54:56+00:00"
}
}
}
);
还有其他方法可以达到相同的结果吗?
- 我是否应该展平数组以便只使用 1 $ 位置运算符?
- 还有其他方法可以在多维数组上推送项目吗?
- 是否应该在代码级别而不是数据库级别处理此逻辑?
解决方案
您需要使用Positional Filtered Operator来实现:
db.times.update(
{},
{
$push: {
"users.$[].projects.$[element].time_entries":{
"duration" : 5,
"start" : "2019-08-29T09:54:56+00:00"
}
}
},
{
arrayFilters: [{"element.pid":1}],
multi: true
}
)
time_entries
此查询会将找到的每个数据推送到数组中pid = 1
。
这将为您提供以下结果:
{
"_id" : ObjectId("5d6e33987f8d7f00c063ceff"),
"date" : "2019-01-01",
"users" : [
{
"user_id" : 1,
"projects" : [
{
"pid" : 1,
"time_entries" : [
{
"duration" : 1,
"start" : "2019-08-29T09:54:56+00:00"
},
{
"duration" : 5.0,
"start" : "2019-08-29T09:54:56+00:00"
}
]
},
{
"pid" : 2,
"time_entries" : []
}
]
},
{
"user_id" : 2,
"projects" : [
{
"pid" : 3,
"time_entries" : []
}
]
}
]
}
推荐阅读
- c# - 如何在创建项目后延迟 25 秒删除项目?
- flutter - 我有一个 covid 跟踪应用程序,我想每天发送有关新病例的通知。即使应用程序在颤动中关闭,我怎么能做到这一点
- javascript - 现有集合的猫鼬自动增量
- azure - 我们可以通过在 ARM 模板中传递 vnet id 将 vnet 集成到 azure 容器注册表吗?
- docker - 如何使用在我的 Dockerfile 中保存为 tar 文件的 docker 图像作为父图像
- dataframe - 将 spark df 转换为后续对的 df
- python - 引用如何在 python 中工作以及如何创建链表的单独副本以与原始链表进行比较
- kotlin - Kotlin Fused Location Provider 不止一次获得位置更新
- html - 我的分页当前页码不可见
- python - 将str转换为日期python