是否可以在MongoDB中数组字段中存在的文档字段上创建索引?

是否可以在MongoDB中数组字段中存在的文档字段上创建索引?,mongodb,indexing,mongodb-query,Mongodb,Indexing,Mongodb Query,我在MongoDB中有这样的文档: { "item" : "I1", "Price" : [ {"d": "2020-07-01", "t":t1, "v":1000}, {"d": "2020-07-01", "t":t2, &qu

我在MongoDB中有这样的文档:

{ 
  "item" : "I1",
  "Price" : 
      [
          {"d": "2020-07-01", "t":t1, "v":1000}, 
          {"d": "2020-07-01", "t":t2, "v":1500}, 
          {"d": "2020-07-01", "t":t3, "v":1350},
          ...                     
      ] 
 },
 { 
   "item" : "I2",
   "Price" :
      [
          {"d": "2020-07-01", "t":t1, "v":1025}, 
          {"d": "2020-07-02", "t":t2, "v":1050},
          ...
      ]
 }
我只是想知道有没有可能在“Price.d”上创建索引? 谢谢

是的,你可以

如果字段是文档数组,则可以对嵌入的字段编制索引以创建复合索引。例如,考虑包含以下文档的集合:


您可以在
{“a.x”:1,“a.z”:1}
上创建复合索引。对于数组,最多只能有一个索引字段的限制也适用。

是的,例如,您可以。密码

--from mongo shell, windows:
//prepare data
> db.test11.find().pretty();
{
        "_id" : ObjectId("5f47c775c42d78fc841f35c5"),
        "item" : "I1",
        "Price" : [
                {
                        "d" : "2020-07-01",
                        "t" : 1,
                        "v" : 1000
                },
                {
                        "d" : "2020-07-01",
                        "t" : 2,
                        "v" : 1500
                },
                {
                        "d" : "2020-07-01",
                        "t" : 3,
                        "v" : 1350
                }
        ]
}
{
        "_id" : ObjectId("5f47c775c42d78fc841f35c6"),
        "item" : "I2",
        "Price" : [
                {
                        "d" : "2020-07-01",
                        "t" : 1,
                        "v" : 1025
                },
                {
                        "d" : "2020-07-02",
                        "t" : 2,
                        "v" : 1050
                }
        ]
}
//create index and explain shows the index used
> db.test11.createIndex({"Price.d":1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.test11.getIndexes();
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "mycustomers.test11"
        },
        {
                "v" : 2,
                "key" : {
                        "Price.d" : 1
                },
                "name" : "Price.d_1",
                "ns" : "mycustomers.test11"
        }
]
> db.test11.find({"Price.d": "2020-07-02"});
{ "_id" : ObjectId("5f47c775c42d78fc841f35c6"), "item" : "I2", "Price" : [ { "d" : "2020-07-01", "t" : 1, "v" : 1025 }, { "d" : "2020-07-02", "t" : 2, "v" : 1050 } ] }
> db.test11.find({"Price.d": "2020-07-02"}).explain();
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "mycustomers.test11",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "Price.d" : {
                                "$eq" : "2020-07-02"
                        }
                },
                "queryHash" : "F5F98F8D",
                "planCacheKey" : "B39E1D2D",
                "winningPlan" : {
                        "stage" : "FETCH",
                        "inputStage" : {
                                "stage" : "IXSCAN",
                                "keyPattern" : {
                                        "Price.d" : 1
                                },
                                "indexName" : "Price.d_1",
                                "isMultiKey" : true,
                                "multiKeyPaths" : {
                                        "Price.d" : [
                                                "Price"
                                        ]
                                },
                                "isUnique" : false,
                                "isSparse" : false,
                                "isPartial" : false,
                                "indexVersion" : 2,
                                "direction" : "forward",
                                "indexBounds" : {
                                        "Price.d" : [
                                                "[\"2020-07-02\", \"2020-07-02\"]"
                                        ]
                                }
                        }
                },
                "rejectedPlans" : [ ]
        },
        },
        "ok" : 1
}
>
可能重复
--from mongo shell, windows:
//prepare data
> db.test11.find().pretty();
{
        "_id" : ObjectId("5f47c775c42d78fc841f35c5"),
        "item" : "I1",
        "Price" : [
                {
                        "d" : "2020-07-01",
                        "t" : 1,
                        "v" : 1000
                },
                {
                        "d" : "2020-07-01",
                        "t" : 2,
                        "v" : 1500
                },
                {
                        "d" : "2020-07-01",
                        "t" : 3,
                        "v" : 1350
                }
        ]
}
{
        "_id" : ObjectId("5f47c775c42d78fc841f35c6"),
        "item" : "I2",
        "Price" : [
                {
                        "d" : "2020-07-01",
                        "t" : 1,
                        "v" : 1025
                },
                {
                        "d" : "2020-07-02",
                        "t" : 2,
                        "v" : 1050
                }
        ]
}
//create index and explain shows the index used
> db.test11.createIndex({"Price.d":1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.test11.getIndexes();
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "mycustomers.test11"
        },
        {
                "v" : 2,
                "key" : {
                        "Price.d" : 1
                },
                "name" : "Price.d_1",
                "ns" : "mycustomers.test11"
        }
]
> db.test11.find({"Price.d": "2020-07-02"});
{ "_id" : ObjectId("5f47c775c42d78fc841f35c6"), "item" : "I2", "Price" : [ { "d" : "2020-07-01", "t" : 1, "v" : 1025 }, { "d" : "2020-07-02", "t" : 2, "v" : 1050 } ] }
> db.test11.find({"Price.d": "2020-07-02"}).explain();
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "mycustomers.test11",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "Price.d" : {
                                "$eq" : "2020-07-02"
                        }
                },
                "queryHash" : "F5F98F8D",
                "planCacheKey" : "B39E1D2D",
                "winningPlan" : {
                        "stage" : "FETCH",
                        "inputStage" : {
                                "stage" : "IXSCAN",
                                "keyPattern" : {
                                        "Price.d" : 1
                                },
                                "indexName" : "Price.d_1",
                                "isMultiKey" : true,
                                "multiKeyPaths" : {
                                        "Price.d" : [
                                                "Price"
                                        ]
                                },
                                "isUnique" : false,
                                "isSparse" : false,
                                "isPartial" : false,
                                "indexVersion" : 2,
                                "direction" : "forward",
                                "indexBounds" : {
                                        "Price.d" : [
                                                "[\"2020-07-02\", \"2020-07-02\"]"
                                        ]
                                }
                        }
                },
                "rejectedPlans" : [ ]
        },
        },
        "ok" : 1
}
>