MongoDB数组索引搜索

时间:2011-01-29 20:44:09

标签: php mongodb nosql

我正在使用MongoDB来存储大量信息,并且需要在索引数组中搜索值。

这是架构:

{ "common_name" : { "name" : "thename", "type" : "thetype" } } 

文档中还有其他值,但这是我正在搜索的唯一值。

所以,我认为这样的东西会起作用:(在shell中)

db.collection.find({common_name:{$in:"thename"}})

但我一无所获。

这看起来就像在这里做的一样: http://www.php.net/manual/en/mongo.queries.php - 但我似乎无法得到任何回报。

我试过

db.collection.find({"common_name.name":"thename"}})

并且它按预期工作,但是要搜索索引上的多个节点(最多4个),它可能会变得难看,基本上为每个子类别定义$或索引,并使我的查询时间翻两番。由于这是自动完成的动力,我无法做到这一点。

奇怪的是,以下内容不会返回任何文件:

db.collection.find({"common_name":{"name":"thename"}})

根据我的理解,与上述查询完全相同。

我对Mongo很新,所以也许我在这里错过了一些大事?

关于如何最快地访问此数据的任何想法(使用锚定的正则表达式)?

我可以使用关系表,但是这不会像Mongo一样破坏NoSQL系统的目的吗?

2 个答案:

答案 0 :(得分:2)

问题是你没有数组。数组看起来像{ "common_name" : [ "name1", "name2", "name3" ] }

使用类似的结构,Mongo可以在单个索引中索引数组的元素,并快速查找包含数组中任何单个项的任何文档。

可以使用数组,只需将偏移定义为您想要的,例如[0]是名称,[1]是类型等。有了这个,你现在可以快速找到任何文件。

如果您的自动填充功能不需要与添加到集合中的最新文档完全一致,您可以改为运行 map-reduce 作业来构建您使用的单独集合只是为了自动完成。映射步骤将为文档中的每个单独的名称字段发出(因此发出后的文档数量是4倍),reduce步骤将计算每个名称的数量(所以1x是所有字段中唯一名称的数量) 。您可以按名称和计数索引生成的集合,这样可以让您的自动完成功能首先推荐最常用的名称。

答案 1 :(得分:1)

  

db.collection.find({"common_name":{"name":"thename"}})根据我的理解,与上述查询完全相同。

不,不是因为只有当common_name的值只是name: thename}时才会匹配,您需要$elemMatch运算符。