我正在使用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系统的目的吗?
答案 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运算符。