我有两个集合:Logs
和Metadatas
。它们都具有字段hash
和application
。
我有一系列相关的Metadatas
,我预计会像这样:
{ hash: string, application: string }[]
{ hash, application }
的每个组合在该数组中都是唯一的。我的目标是找到任何Logs
和application
的组合作为该数组中的一项存在。
因此,我基本上需要执行以下操作:
hash
这可以在我的JavaScript中完成,但是集合可能非常大,我宁愿直接将其卸载到MongoDB。是否有进行这种查询的最佳方法?
我尝试了几种不同类型的聚合,但是找不到解决方案。
答案 0 :(得分:1)
您可以对每个项目进行查询,而不是对整个数组进行一次查询,以轻松解决此问题:
const logs = await Promise.all(
metadatas.map(metadata => Logs.findOne(metadata))
)
查询的数量是线性到您的内存中的元数据阵列的大小和所有查询同时进行这样的复杂性应该是O(timeOfTheLongestQuery)
如果有更多的日志,可以匹配的{ application, hash }
元组,使用find
,而不是findOne
:
const logs = await Promise.all(
metadatas.map(metadata => Logs.find(metadata))
)
这将为您提供一个2D数组,您可以将其展平:
const logs = flatten(await Promise.all(
metadatas.map(metadata => Logs.find(metadata))
))
或转换为Map<application + hash, listOfLogs>
,如果以后需要使用相同的数据进行处理:
const logsMap = new Map(await Promise.all(
metadatas.map(async metadata => [
JSON.stringify(metadata), // can use a different stringification strategy here
await Logs.find(metadata)
])
))