Ich habe eine große Timeseries -Sammlung mit Millionen von Dokumenten, die als "Ereignisse" bezeichnet werden, die die folgende Struktur haben < /p>
Code: Select all
{
"_id": {"$oid": "123456"},
"class": "...",
"event_data": {...},
"ts": {"$date": "2025-01-01T01:00:00.000Z"}
}
mit Indizes im Feld TS sowohl aufsteigend als auch absteigend. Ich versuche eine Anfrage auszuführen, um die Dokumente zwischen zwei Zeitstempeln mit Java zu ziehen. Gefällt mir: < /p>
Code: Select all
ZonedDateTime lowerBound = ...;
ZonedDateTime upperBound = ...;
var query = Query.query(new Criteria().andOperator(
Criteria.where("ts").gte(lowerbound.toInstant().toEpochMilli()),
Criteria.where("ts").lt(upperbound.toInstant().toEpochMilli()),
)
var result = mongoTemplate.find(query, Events.class)
< /code>
Diese Abfrage funktioniert ... schließlich nach 20 Minuten, da sie die gesamten Sammlungen nicht mit den Indizes scannt. Wenn ich Intellijs Debugger verwende, kann ich sehen, dass die Abfrage wie folgt formatiert wird: < /p>
Query: { "$and" : [{ "ts": { "$gte" : 1733852133000}}. { "ts" : { "$lt": 1733853933000}} ] }
< /code>
, was ich in den Code der MongoDB -Konsole als solcher übersetzt habe: < /p>
db.events.find({
"$and": [
{ "ts": { "$gte": 1733852133000}},
{ "ts": { "$lt": 1733853933000}},
]
})
Ausführen dieses Nachahms, was genau im Java -Code passiert, funktioniert technisch, aber die gesamte Sammlung scannt, was ich weiter erkennen kann, ob eine do a .explain () und nur den Collscan -bühne sehen kann.
Code: Select all
db.events.find({
"$and": [
{ "ts": { "$gte": new Date("2025-01-01T01:00:00Z)}},
{ "ts": { "$lt": new Date("2025-01-02T01:00:00Z)}},
]
})
, was auch mit dem Ausführen von .explain () übereinstimmt, da ich den Fetch und ixscan Stufen sehen kann. Wie kann ich meinen Java -Code in die zweite Version übersetzen lassen und tatsächlich die Indexierung verwenden, die wir vorhanden haben? /> [*] Hinzufügen eines Hinzufügens ("TS_1") < /code>, um die Verwendung eines Index zu erzwingen. Wenn Sie dies in der MongoDB -Konsole ausführen, entspricht es Fehler mit Hinweise, die angegeben sind, nicht einem vorhandenen Index , der völlig falsch ist, da ich den Index beim Ausführen von .getIndexes () sehen kann. Das Ausführen in Java -Code scheint das gleiche
Problem zu haben wie zuvor, wo es einen Collscan