mongodb - 用于按对象键搜索的结构嵌套对象列表
问题描述
我有从收集点 ( sourceId
) 获取的数据,收集点 ( ) 记录samples
来自不同探头 ( ) 的数据 ( probeId
)。我需要按 bysamples
构造数据。probeId
sourceId
规格
- 经常插入
- 偶尔阅读
- 从不更新或删除
sourceIds
通过使用列表和列表进行索引来读取probeIds
- 原子插入,包括何时
probeId
不在探针列表中且需要创建探针子文档
问题
实现上述目标的最佳结构是什么?特别是,首选结构如何有助于实现第 5 点?我无法让 upsert 仅匹配probeId
并忽略samples
and meta
。
到目前为止,我已经考虑了以下两种结构:
{'sourceId': ObjectId(),
'probes': [
{
'probeId': ObjectId(),
'meta': {...},
'samples': [...]
},
...
]
}
和
{'sourceId': ObjectId(),
'probes': [
{
ObjectId(): { # probeId key
'meta': {...},
'samples': [...]
}
}
]
}
目前我使用第一个结构并像这样搜索:
db.collection.aggregate(
{'$match': {'sourceId': {'$in': source_id_list}}},
{'$project': {'probes': {'$filter': {'input': '$probes', 'cond': {'$in': ['$$this.probeId', probe_id_list]}}}}}
)
为清楚起见,第 5 点应按如下方式工作(假设使用第一个结构):
插入前:
{'sourceId': ObjectId('1'),
'probes': [
{
'probeId': ObjectId('2'),
'meta': {...},
'samples': [...]
}
]
}
probeId
在为=3插入一个示例之后,对于sourceId
=1(请注意,不仅添加了示例,还添加了包含子文档):
{'sourceId': ObjectId('1'),
'probes': [
{
'probeId': ObjectId('2'),
'meta': {...},
'samples': [...]
},
{
'probeId': ObjectId('3'),
'meta': {},
'samples': [<NEW SAMPLE DATA>]
}
]
}
解决方案
推荐阅读
- php - 遍历 JSON 数组时无法捕获某个值
- active-directory - The right way to handle accounts in AD to have SSO for different applications
- python - 如何在 Python 中使用迭代器从文件中获取下一行,检查它是否匹配正则表达式,如果匹配则添加到数组中?
- c# - LINQ Max() 在列表里面的列表
- java - maven surefire 插件来查找本机 dll
- php - 提交对表所做的更改
- python - ValueError: features 应该是 `Tensor`s 的字典。给定类型:
- r - 如何将二进制数据读入位深度为 24 readBin 的 R
- javascript - 如何在 JS Find 函数中使用条件
- java - open-saml 3 缺少工件