在第二种情况下,查询肯定会容易得多,其中“组”是一个子文档数组,每个子文档都有一个“id”和一个“名称”。
Mongo 不支持“通配符”查询,因此如果您的文档是第一种方式构建的,并且您想查找值为“hi”的子文档,但不知道键是 152,您将无法做。使用第二种文档结构,您可以轻松查询 {"groups.name":"hi"}。
有关查询嵌入对象的更多信息,请参阅标题为“Dot Notation (Reaching into Objects)”的文档 http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29
“值“高级查询”文档的“数组中”和“嵌入式对象中的值”部分也很有用:
http ://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray
对于 {'groups.id':1} 上的索引,将为每个文档中每个“groups”数组中的每个“id”键创建一个索引条目。使用“组”上的索引,每个文档只会创建一个索引条目。
如果您有第二种类型的文档和组索引,则您的查询必须匹配整个子文档才能使用索引。例如,给定文档:
{ "_id" : 1, "groups" : [ { "id" : 152, "name" : "hi" }, { "id" : 111, "name" : "group2" } ] }
查询
db.<collectionName>.find({groups:{ "id" : 152, "name" : "hi" }})
将使用索引,但查询
db.<collectionName>.find({"groups":{$elemMatch:{name:"hi"}}})
或者
db.<collectionName>.find({"groups.name":"hi"})
将不会。
您创建的索引应取决于您最常执行的查询。
您可以使用 .explain() 命令试验查询使用的索引(如果有的话)。 http://www.mongodb.org/display/DOCS/Explain 第一行“光标”会告诉你正在使用哪个索引。"cursor" : "BasicCursor" 表示正在执行完整的集合扫描。
文档中有更多关于索引的信息:
http ://www.mongodb.org/display/DOCS/Indexes
上面的“索引数组元素”部分链接到标题为“Multikeys”的文档:
http ://www.mongodb.org/display/DOCS/Multikeys
希望这将提高您对如何查询嵌入式文档以及如何使用索引的理解。如果您有任何后续问题,请告诉我们!