[英]MongoDB not using index inside nested array of documents
我有一個龐大而復雜的收藏,看起來像這樣:
{
"_id" : ObjectId("574c55312368e5aa90bbf27b"),
"id" : NumberInt(10000),
"BookieId" : NumberInt(1),
"EventBookieId" : null,
"LeagueId" : NumberInt(214),
"LeagueNameId" : NumberInt(4571),
"Team1Id" : NumberInt(435),
"Team1NameId" : null,
"Team2Id" : NumberInt(430),
"Team2NameId" : null,
"EventDateTime" : ISODate("2013-09-14T13:00:00.000+0000"),
"isNew" : true,
"CountryId" : NumberInt(36),
"isCountry" : true,
"isLeague" : true,
"Gameid" : null,
"Reversed" : false,
"eventId" : NumberInt(10000),
"bets" : [
{
"id" : NumberInt(1),
"EventConnectionId" : NumberInt(10000),
"isCorners" : false,
"DateTime" : ISODate("2013-09-10T08:06:43.333+0000"),
"IsLive" : false,
"Team1Score" : null,
"Team2Score" : null,
"Team1RedCards" : null,
"Team2RedCards" : null,
"odds" : [
]
},
{
"id" : NumberInt(2),
"EventConnectionId" : NumberInt(10000),
"isCorners" : false,
"DateTime" : ISODate("2013-09-10T18:50:26.840+0000"),
"IsLive" : false,
"Team1Score" : NumberInt(0),
"Team2Score" : NumberInt(0),
"Team1RedCards" : null,
"Team2RedCards" : null,
"odds" : [
{
"id" : NumberInt(62282718),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "21968173",
"ScrapingDateTime" : ISODate("2013-09-13T07:39:15.810+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 1.81,
"Odds2" : 2.1236,
"Odds3" : null,
"MaxBet" : NumberInt(2000),
"Bet" : "Hcap",
"BetGamePart" : NumberInt(0),
"Line" : -0.25,
"ID_IDENTITY" : NumberInt(1)
},
{
"id" : NumberInt(62282719),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "21968175",
"ScrapingDateTime" : ISODate("2013-09-13T07:39:15.810+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 2.04167,
"Odds2" : 1.86,
"Odds3" : null,
"MaxBet" : NumberInt(2000),
"Bet" : "Total",
"BetGamePart" : NumberInt(0),
"Line" : 2.0,
"ID_IDENTITY" : NumberInt(2)
},
{
"id" : NumberInt(62282720),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "21968177",
"ScrapingDateTime" : ISODate("2013-09-13T07:39:15.810+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 2.16,
"Odds2" : 3.45,
"Odds3" : 3.05,
"MaxBet" : NumberInt(1000),
"Bet" : "X12",
"BetGamePart" : NumberInt(0),
"Line" : null,
"ID_IDENTITY" : NumberInt(3)
},
{
"id" : NumberInt(62282721),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "21968179",
"ScrapingDateTime" : ISODate("2013-09-13T07:39:15.810+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 2.21951,
"Odds2" : 1.7,
"Odds3" : null,
"MaxBet" : NumberInt(1000),
"Bet" : "Hcap",
"BetGamePart" : NumberInt(1),
"Line" : -0.25,
"ID_IDENTITY" : NumberInt(4)
},
{
"id" : NumberInt(62282722),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "21968180",
"ScrapingDateTime" : ISODate("2013-09-13T07:39:15.810+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 2.78,
"Odds2" : 3.9,
"Odds3" : 1.99,
"MaxBet" : NumberInt(500),
"Bet" : "X12",
"BetGamePart" : NumberInt(1),
"Line" : null,
"ID_IDENTITY" : NumberInt(5)
},
{
"id" : NumberInt(62282723),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "21968181",
"ScrapingDateTime" : ISODate("2013-09-13T07:39:15.810+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 1.93,
"Odds2" : 1.95,
"Odds3" : null,
"MaxBet" : NumberInt(1000),
"Bet" : "Total",
"BetGamePart" : NumberInt(1),
"Line" : 0.75,
"ID_IDENTITY" : NumberInt(6)
},
{
"id" : NumberInt(62290838),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "14382209",
"ScrapingDateTime" : ISODate("2013-09-13T14:38:11.303+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 1.81,
"Odds2" : 2.1236,
"Odds3" : null,
"MaxBet" : NumberInt(2000),
"Bet" : "Hcap",
"BetGamePart" : NumberInt(0),
"Line" : -0.25,
"ID_IDENTITY" : NumberInt(7)
},
{
"id" : NumberInt(62290839),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "14382211",
"ScrapingDateTime" : ISODate("2013-09-13T08:27:39.600+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 2.05263,
"Odds2" : 1.85,
"Odds3" : null,
"MaxBet" : NumberInt(2000),
"Bet" : "Total",
"BetGamePart" : NumberInt(0),
"Line" : 2.0,
"ID_IDENTITY" : NumberInt(8)
},
{
"id" : NumberInt(62290840),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "14382213",
"ScrapingDateTime" : ISODate("2013-09-13T09:29:22.863+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 2.15,
"Odds2" : 3.45,
"Odds3" : 3.1,
"MaxBet" : NumberInt(1000),
"Bet" : "X12",
"BetGamePart" : NumberInt(0),
"Line" : null,
"ID_IDENTITY" : NumberInt(9)
},
{
"id" : NumberInt(62290841),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "14382215",
"ScrapingDateTime" : ISODate("2013-09-13T14:38:11.303+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 2.21951,
"Odds2" : 1.7,
"Odds3" : null,
"MaxBet" : NumberInt(1000),
"Bet" : "Hcap",
"BetGamePart" : NumberInt(1),
"Line" : -0.25,
"ID_IDENTITY" : NumberInt(10)
},
{
"id" : NumberInt(62290842),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "14382216",
"ScrapingDateTime" : ISODate("2013-09-13T14:38:11.303+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 2.78,
"Odds2" : 3.9,
"Odds3" : 1.99,
"MaxBet" : NumberInt(500),
"Bet" : "X12",
"BetGamePart" : NumberInt(1),
"Line" : null,
"ID_IDENTITY" : NumberInt(11)
},
{
"id" : NumberInt(62290843),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "14382217",
"ScrapingDateTime" : ISODate("2013-09-13T14:38:11.303+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 1.93,
"Odds2" : 1.95,
"Odds3" : null,
"MaxBet" : NumberInt(1000),
"Bet" : "Total",
"BetGamePart" : NumberInt(1),
"Line" : 0.75,
"ID_IDENTITY" : NumberInt(12)
},
{
"id" : NumberInt(62381139),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "20864356",
"ScrapingDateTime" : ISODate("2013-09-13T14:38:11.303+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 2.05263,
"Odds2" : 1.85,
"Odds3" : null,
"MaxBet" : NumberInt(2000),
"Bet" : "Total",
"BetGamePart" : NumberInt(0),
"Line" : 2.0,
"ID_IDENTITY" : NumberInt(13)
},
{
"id" : NumberInt(62381140),
"BetId" : NumberInt(2),
"BookieId" : NumberInt(1),
"BookieBetId" : "20864358",
"ScrapingDateTime" : ISODate("2013-09-13T14:38:11.303+0000"),
"MinuteInGame" : null,
"GamePart" : null,
"Odds1" : 2.15,
"Odds2" : 3.45,
"Odds3" : 3.1,
"MaxBet" : NumberInt(1000),
"Bet" : "X12",
"BetGamePart" : NumberInt(0),
"Line" : null,
"ID_IDENTITY" : NumberInt(14)
}
]
}
]
}
我在ScrapingDateTime上創建了一個索引,該索引駐留在賠率數組中,而該賠率數組又位於bets數組中。 這是索引:
{"bets.0.odds.0.ScrapingDateTime" : 1}
當我運行此查詢時,它不使用索引而不執行集合掃描,任何人都可以解釋該方法,或者我應該使用該索引做什么?
db.EventsBetsOdds.find({'bets.odds.ScrapingDateTime':{'$gte':ISODate("2014-08-13T14:38:11.303Z"),
'$lt':ISODate("2014-09-14T14:38:11.303Z")}},
{"bets.odds.ScrapingDateTime":1,"bets.odds.Line":1,"bets.IsLive":1,_id:0}).explain()
索引{“ bets.0.odds.0.ScrapingDateTime”:1}是指名為“ 0”的子文檔,而不是位置為零的數組元素。 例如:
{
"bets" : {
"0" : {
"odds" : {
"0" : {
"ScrapingDateTime" : ....
}
}
}
}
}
所需的索引將是:
db.EventsBetsOdds.ensureIndex({ "bets.odds.ScrapingDateTime" : 1 })
如果您希望索引涵蓋查詢,則索引為:
db.EventsBetsOdds.createIndex({
"bets.odds.ScrapingDateTime" : 1,
"bets.odds.Line" : 1,
"bets.IsLive" : 1
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.