gpt4 book ai didi

mongodb - 服务器端在 mongodb 中设置交集

转载 作者:可可西里 更新时间:2023-11-01 10:07:58 25 4
gpt4 key购买 nike

在我正在处理的一个应用程序中,一个要求是进行大量集合交集,大约有 10-1,000,000 个项目。我们相交的项目只是 ObjectId 的。

例如,有一个 boxes 文档,在 boxes 文档中有一个 item_ids 数组。每个盒子的 item_ids 数组包含 10-1,000,000 个 ObjectId。

这里的最终目标是说,给定 ObjectId 为 4d3dc3898951498107000005 的盒子 A 和 ObjectId 为 4d3dc3898951498107000002 的盒子 B,它们有哪些共同的 item_ids?

这是我的做法:

db.boxes.distinct("item_ids", {'_id' : {$in : [ObjectId("4d3dc3898951498107000005"), ObjectId("4d3dc3898951498107000002")]}})

首先只是好奇这是否是一种合理的方法。到目前为止,在我的研究中,map reduce 似乎是大型交叉路口的常见建议,但不建议将其用于实时查询。

其次,好奇这在分片环境中的表现如何? mongos 会在它需要的 mongod 上运行大量查询并神奇地聚合我的结果吗?

最后,如果以上是理智的,那么这样做是否也是理智的:

db.items.find({'_id' : { $in : db.eval(function() {return db.boxes.distinct("item_ids", {_id:{$in:[ObjectId("4d3dc3898951498107000005"), ObjectId("4d3dc3898951498107000002")]}}); }) }}) 

这基本上是找出盒子 A 和盒子 B 有哪些共同点,然后在一个服务器端查询中将它们具体化为对象。这似乎也适用于 .limit 和 .skip 以有效地实现数据集的分页。

无论如何,任何反馈都是有值(value)的,谢谢!

最佳答案

我认为您可能需要重新考虑您的架构。如果您在一个数组中有 1,000,000 个 ObjectID,每个 12 字节,即 12MB,甚至不计算 BSON 开销,这对于大型数组来说可能很重要*(可能另外 8MB 左右)。在 1.8 中,我们将最大文档大小从 4MB 提高到 16MB,但即使这样也不足以存储您要存储的对象。

*由于历史原因,我们在数组中存储每个元素的简化索引,当您有 <100 个元素时这很好,但当您需要 6 或 7 位数字时加起来。

关于mongodb - 服务器端在 mongodb 中设置交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4802251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com