复合键和嵌入键

192 阅读3分钟

复合键和嵌入键

创建涉及多个字段的复合索引的命令是:

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万现金大奖」