Reputation: 514
I have documents like these in 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},
...
]
}
I just wondering is it possible to create index over "Price.d"? Thanks
Upvotes: 0
Views: 372
Reputation: 334
Yes, you can for your example. the code.
--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
}
>
Upvotes: 0
Reputation: 22974
Yes you can.
Referenece from the documentation
If a field is an array of documents, you can index the embedded fields to create a compound index. For example, consider a collection that contains the following documents:
{ _id: 1, a: [ { x: 5, z: [ 1, 2 ] }, { z: [ 1, 2 ] } ] }
{ _id: 2, a: [ { x: 5 }, { z: 4 } ] }
You can create a compound index on { "a.x": 1, "a.z": 1 }
The restriction where at most one indexed field can be an array also applies.
Upvotes: 1