复合键和嵌入键
创建涉及多个字段的复合索引的命令是:
db.ratings.ensureIndex({ movie_id:1, rating:-1 1);
这将在 movie_id (升序排序)和rating(降序排序)上创建一个复合索引。您可以从涉及 movie_id 和 rating 的四个可能的复合索引中再创建三个索引。这四种可能性由于可能的提升和两个键的降序排序。排序顺序可能会影响涉及排序和范围查询的查询,因此在为集合定义复合索引时要记住顺序。
可以使用包含 movie_id 和rating的复合索引来查询这两个键和第一个键(即 film _ id)上都匹配的文档。当使用此索引单独根据 movie_id 筛选文档时,其行为类似于 movie_id上的单个字段索引。
复合键不限于两个键。您可以包含任意数量的键。可以像下面这样创建 movie_id、rating和 user_id 的复合索引:
db.ratings.ensureIndex({ movie_id:1, rating:-1, user_id:1 });
此索引可用于查询以下任何组合:
-
movie_id,rating,and user_id
-
movie_id and rating
-
movie_id
movie_id和rating 复合索引还可以包括嵌套(或嵌入)字段。在了解复合索引如何涉及嵌套字段之前,我将介绍如何创建涉及嵌套字段的单个索引。为了说明这一点,我们使用了一个集合(名为 people 2)。
people2集合的一个要素如下:
{"_id" : objectId("4d0688c6851e434340b173b7"), "name":"joe",
"age":27, "address":{
"city" : "palo alto", "state": "ca",
"zip" : "94303", "country": "us"
}
}
您可以在 address 字段的 zip 字段上创建如下索引:
db.people2.ensureIndex({ "address.zip":1 });
接下来,可以为 name 和 address. zip 字段创建一个复合索引:
db.people 2.ensureIndex ({ name: 1,“ address.zip”: 1}) ;
您还可以选择整个子文档作为索引的键,这样就可以为address字段创建单个索引:
db.people2.ensureIndex({ address:1 });
这将索引整个文档,而不仅仅是文档的 zip 字段。如果将整个文档作为查询文档传递以获取集合的子集,则可以使用这样的索引。
MongoDB 集合字段还可以包含数组而不是文档。您也可以对这些字段进行索引。
现在参考订单集合的另一个示例,以演示如何对数组属性进行索引。
订单集合的元素如下:
{
"_id":objectId("4cccff35d3c7ab3d1941b103"),
"order_date" : "Sat Oct 30 2010 22:30:12 GMT-0700(PDT)",
"line_items": [
{
"item":{
"name":"latte",
"unit_price":4 ,},
"quantity":1,},
{"item":{
"name" : "cappuccino",
"unit_price":4.25 },
"quantity":1 },{
"item":{
"name": "regular",
"unit_price":2 },
"quantity":2]}
可以使用 line_item 进行索引:
EnsureIndex ({ line _ item: 1}) ;
当索引字段包含数组时,数组的每个元素都被添加到索引中。此外,还可以通过 line_item 数组的 item 属性进行索引:
EnsureIndex ({“ line _ item. item”: 1}) ;
您可以更进一步,通过 line_item 数组中包含的 item 文档的 name 属性对其进行索引,如下所示:
EnsureIndex ({“ line _ item. item.name”: 1}) ;
因此,您可以通过这个嵌套的 name 字段进行如下查询:
Find ({“ line _ item. item.name”: “ latte”}) ;
本文正在参加「金石计划 . 瓜分6万现金大奖」