是否可以在MongoDB中数组字段中存在的文档字段上创建索引?
我在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
{
"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
}
>