如何在MongoDB中对两个数组进行索引?

13
db.hello.ensureIndex({"array1":1, "array2":1})
MongoDB不允许这样做,因为他们说“它可能会失控”。然而,我知道我的数组永远不会超过长度3。如何黑客式地使MongoDB允许同时索引多个数组?
使用复合索引时,任意文档中最多一个被索引的值可以是一个数组。因此,如果我们在{a:1, b:1}上建立索引,则以下文档都是可以的:
{a:[1,2], b:1}和{a:1, b:[1,2]}。
但是,以下文档将无法插入,并显示错误消息“cannot index parallel arrays”:
{a:[1,2], b:[1,2]}
索引平行数组的问题在于,复合键的笛卡尔积中的每个值都必须被索引,这可能会很快失控。

你确定需要在两个数组上都创建索引吗?如果其中一个已经有很高的选择性,那可能就足够了。 - Thilo
@Thilo ... 第一个数组通常有大约100个元素。第二个数组大约有2-3个元素。您认为我需要对第二个数组进行索引吗? - TIMEX
1
@TIMEX 不要索引第二个数组,使用explain命令查看其性能如何。 - Joe
@Joe 如果我现在没有任何数据(数据库只是用于测试),那怎么办? - TIMEX
@Joe,@Thilo,@Remon 感谢你们的所有评论。第一个数组是 Facebook 好友列表(平均约200个?)。第二个数组是人们的名字和姓氏... ['Jennifer','smith']。换句话说,我想查找在我的好友列表中并且姓名匹配的人。 - TIMEX
显示剩余2条评论
1个回答

13

回答你的问题的简短答案是:你不需要这样做。唯一可用的选项是将每个唯一的二元组作为单个数组元素存储。因此,不要像这样:

{a:[1,2], b:[8,9]}

您存储

{ab:[[1,8], [1,9], [2,8], [2,9]]}

显然这个方法有一些缺点,因此它是否是一个适当的解决方法,取决于你具体的用例。 但我确实同意,Mongo不应该拒绝多个数组索引仅仅为了防止一些傻瓜错误。对于小型/低基数的数组来说,这是一个很好的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接