day = 17
db.mydatabase.mycollection.find({"date.day" : day})
weiß jemand, wie man diese Abfrage macht?
Mein Ansatz hat einige Performance-Probleme, verwenden Sie nur, wenn Sie keine andere Wahl haben (siehe meinen Beitrag und meine Kommentare). Stattdessen ist die Antwort von DrColossos der beste Weg, dies zu tun … bitte akzeptieren Sie seine als Antwort
– RameshVel
16. November ’11 um 7:39
Dies ist eindeutig kein Duplikat. Wenn die Syntax, die in dieser Frage beschrieben wurde, tatsächlich eines Tages in MongoDB implementiert werden sollte, würden wir sie nie in den Antworten auf die andere Frage finden, da sie nach zwei völlig unterschiedlichen Dingen fragen (Vergleich von Datumseigenschaften vs ). Die Lösungen sind zufällig die gleichen, müssen aber nicht und könnten theoretisch (und vielleicht Wille eines Tages) variieren.
– phil294
14. August ’19 um 21:59
Datumsangaben werden in ihrem Zeitstempelformat gespeichert. Wenn Sie alles haben möchten, was zu einem bestimmten Monat gehört, fragen Sie nach Beginn und Ende des Monats.
var start = new Date(2010, 11, 1);
var end = new Date(2010, 11, 30);
db.posts.find({created_on: {$gte: start, $lt: end}});
//taken from http://cookbook.mongodb.org/patterns/date_range/
Ist es der einzige Weg? Gibt es eine Möglichkeit, nur den Monat meines Datumsobjekts in meiner Datenbank abzurufen?
– kschaeffler
15. November ’11 um 13:15
@DrColossos, es gibt eine andere Möglichkeit, dies mit $where . zu tun
– RameshVel
15. November ’11 um 13:17
@DrColossos, Ihr Ansatz scheint besser zu sein als meiner. $where expression hat einige Leistungsprobleme, bitte überprüfen Sie meine Antwort für weitere Informationen …
– RameshVel
16. November ’11 um 7:28
Sie müssen einen Tag plus einplanen end um sicherzustellen, dass alle 31 Tage enthalten sind. Übrigens, month=11 ist Dezember, nicht November. Die Op scheint sich auf Nov.
– zs2020
11. November ’13 um 22:52
Wow, ist das scheiße oder was … wenn Sie nach einem bestimmten Tag abfragen möchten, müssen Sie auf die Tage und das Monatsende achten …. der Monat kann 28, 29, 30 oder 31 Tage haben. .warum konnten sie nicht etwas machen wie: date: { $year: 2014, $month:4 }? Dies ist keine Abfragesprache, sondern Programmierung.
– dakt
16. Apr. ’14 um 11:38
RameshVel
Sie können mongodb-Sammlungen nicht direkt nach Datumskomponenten wie Tag oder Monat abfragen. Aber es ist möglich, indem Sie das spezielle verwenden $wo Javascript-Ausdruck
Verwenden Sie $where nur, wenn Sie keine andere Wahl haben. Es kommt mit den Leistungsproblemen. Bitte lesen Sie die Kommentare unten von @kamaradclimber und @dcrosta. Ich werde diesen Beitrag öffnen, damit die anderen Leute die Fakten darüber erfahren.
Dies ist eine praktische Idee, jedoch wird von der Verwendung von $where wirklich abgeraten, wenn Sie eine gute Leistung erzielen möchten: Es erfordert eine globale Sperre. Siehe @DrColossos Antwort für eine bessere Möglichkeit, dies zu tun.
– Kamaradkletterer
15. November ’11 um 14:03
@kamaradclimber, ja das stimmt, mir ist bewusst, dass dies langsamer ist als die nativen Operatoren, da keine Indizes verwendet werden. Aber bei der globalen Sperre bin ich mir nicht sicher… bist du dir sicher…? alle Links, die die Behauptung bestätigen, sehr hilfreich….
– RameshVel
15. November ’11 um 14:12
Ich habe in den Dokumenten keine Spur von Sperre gefunden. Hier ist ein Link für Leistungsverlust: mongodb.org/display/DOCS/…. Ich glaube, ich habe die Sperridee aus dem db.eval-Absatz, also vergessen wir es einfach 🙂
– Kamaradkletterer
15. November ’11 um 16:39 Uhr
Die Antwort von DrColossos ist immer noch viel schneller
– Kamaradkletterer
15. November ’11 um 16:41
Es ist kein Schloss an sich, sondern jedes mongod -Instanz hat nur einen Javascript-Kontext, in dem jedes Javascript ausgeführt wird ($where, kartenreduzierte Jobs usw.). Abfragen werden regelmäßig zurückgegeben, sodass eine Abfrage eine andere nicht vollständig blockiert, aber mehrere Abfragen oder andere JavaScript-Arbeiten werden langsamer. Deshalb $where ist nicht zu empfehlen.
– dcrosta
15. November ’11 um 18:45
Wie wäre es, den Monat in einer eigenen Eigenschaft zu speichern, da Sie ihn abfragen müssen? weniger elegant als $where, aber wahrscheinlich besser abschneiden, da es indiziert werden kann.
Viel besser, das ist der richtige Weg (AKA-Index ^^).
– Thomas Decaux
26. Mai ’15 um 9:15
Wenn Sie nach Dokumenten suchen möchten, die zu einem bestimmten Monat gehören, stellen Sie sicher, dass Sie wie folgt abfragen:
// Anything greater than this month and less than the next month
db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lt: new Date(2015, 7, 1)}});
Vermeiden Sie Abfragen wie unten so oft wie möglich.
// This may not find document with date as the last date of the month
db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lt: new Date(2015, 6, 30)}});
// don't do this too
db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lte: new Date(2015, 6, 30)}});
chridam
Verwenden Sie die $expr Operator, der die Verwendung von Aggregationsausdrücken innerhalb der Abfragesprache ermöglicht. Dies gibt Ihnen die Möglichkeit, die Datumsaggregationsoperatoren in Ihrer Abfrage wie folgt:
Der $redact Operator enthält die Funktionalität von $project und $match Pipeline und gibt alle Dokumente zurück, die der Bedingung entsprechen mit $$KEEP und verwerfen Sie diejenigen aus der Pipeline, die nicht übereinstimmen, indem Sie verwenden $$PRUNE Variable.
Puneet Singh
Sie können Aufzeichnungen nach Monat, Tag, Jahr usw. von Datumsangaben nach finden Datumsaggregationsoperatoren, mögen $dayOfYear, $dayOfWeek, $Monat, $Jahr etc.
Als Beispiel, wenn Sie alle Bestellungen haben möchten, die im April 2016 erstellt wurden, können Sie die folgende Abfrage verwenden.
Hier wird ein Datumstypfeld in Dokumenten erstellt, und $$ROOT haben wir verwendet, um alle anderen Felder in der nächsten Phase an das Projekt weiterzugeben und uns alle Details der Dokumente zu geben.
Sie können die obige Abfrage nach Ihren Bedürfnissen optimieren, es ist nur ein Beispiel. Um mehr über Datumsaggregationsoperatoren zu erfahren, besuchen Sie die Verbindung.
CEDA
Sie können verwenden MongoDB_DataObject Wrapper, um eine solche Abfrage wie folgt durchzuführen:
$model = new MongoDB_DataObject('orders');
$model->whereAdd('MONTH(created) = 4 AND YEAR(created) = 2016');
$model->find();
while ($model->fetch()) {
var_dump($model);
}
ODER auf ähnliche Weise mit direkter Abfragezeichenfolge:
$model = new MongoDB_DataObject();
$model->query('SELECT * FROM orders WHERE MONTH(created) = 4 AND YEAR(created) = 2016');
while ($model->fetch()) {
var_dump($model);
}
.
4446200cookie-checkAbfrage von Mongodb nach Monat, Tag, Jahr … einer Datumszeityes
Mein Ansatz hat einige Performance-Probleme, verwenden Sie nur, wenn Sie keine andere Wahl haben (siehe meinen Beitrag und meine Kommentare). Stattdessen ist die Antwort von DrColossos der beste Weg, dies zu tun … bitte akzeptieren Sie seine als Antwort
– RameshVel
16. November ’11 um 7:39
Dies ist eindeutig kein Duplikat. Wenn die Syntax, die in dieser Frage beschrieben wurde, tatsächlich eines Tages in MongoDB implementiert werden sollte, würden wir sie nie in den Antworten auf die andere Frage finden, da sie nach zwei völlig unterschiedlichen Dingen fragen (Vergleich von Datumseigenschaften vs ). Die Lösungen sind zufällig die gleichen, müssen aber nicht und könnten theoretisch (und vielleicht Wille eines Tages) variieren.
– phil294
14. August ’19 um 21:59