gpt4 book ai didi

arrays - 针对 MongoDB 集合的精确数组匹配进行优化

转载 作者:可可西里 更新时间:2023-11-01 09:53:13 28 4
gpt4 key购买 nike

我有一个集合,我只需要按整个数组查找文档;我想不出任何我只想通过该数组的一个值来查找文档的场景。不幸的是,始终为数组值激活的多键功能显然无法停用。

documentation它说“索引将用于查找值的子集(当前是第一个),然后将检查文档是否完全匹配。”我认为这大大降低了我的表现。尽管有索引,但有些查找需要 70 毫秒,有些需要几分钟,因为根据第一个元素,MongoDB 有时必须搜索几千或几十万个文档。至少那是我的理论。

有什么方法可以避免这个问题,还是我应该序列化我的数组并将它们存储为字符串?

提前致谢!

最佳答案

也许你可以使用像这样的子文档:

{
array_sub_doc: { arr: [1,2,3,4,5] }
}

这样你就可以像这样进行匹配:

db.coll.ensureIndex({array_sub_doc:1});
db.coll.find({array_sub_doc: {arr:[1,2,3,4,5]}})

更新 我发现了导致大型阵列失败的原因。索引键 > 800 字节将不会被索引。因此,如果您有一个很大的子文档并且在其上放置了一个索引,如果它大于 800 字节,并且您尝试搜索它,您将找不到它。如果您取消索引并再次搜索同一个子文档,您会找到它(尽管这将是一个完整的集合扫描)。

这在此处记录为限制,将在未来的版本中删除:https://jira.mongodb.org/browse/SERVER-3372

因此,这通常适用于小型阵列。

这里有一些测试代码,以防有人想尝试一下:

var randomArray = function() {
var len = 80;
var randomarr = new Array();
for (var i=0; i<len; i++) {
randomarr.push(Math.floor(Math.random() *10000));
}
return randomarr;
}

var insert = function() {
db.Test2.ensureIndex({array_sub_doc:1});
for(var i=0;i<10000;i++) {
db.Test2.save({array_sub_doc: {arr: randomArray()}});
}
}

db.Test2.remove();
insert();

var one = db.Test2.findOne();
db.Test2.findOne({array_sub_doc:one.array_sub_doc});

//...

db.Test2.find({array_sub_doc:one.array_sub_doc}).explain(0);
/* outputs:
{
"cursor" : "BtreeCursor array_sub_doc_1",
"nscanned" : 1,
"nscannedObjects" : 1,
...
*/

关于arrays - 针对 MongoDB 集合的精确数组匹配进行优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8914635/

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