2016-05-26 13 views
2

Verwenden von Mongoose Ich versuche, Daten aus meiner Datenbank basierend auf einem Datum auszuwählen. In meinem Fall ein Konto, auf das seit mehr als einer Stunde nicht zugegriffen wurde.MongoDB Datum Vergleichsprobleme

Ich bin keine Ergebnisse erhalten, wenn die Abfrage ausgeführt wird:

db.accounts.findOne({ "last_used": { "$lte": "2016-05-26T09:31:08.480Z" }}) 

Hier ist mein Code:

bin/App.js

import AccountModel from '../Models/Account'; 

let lastHour = new Date(); 
lastHour.setHours(lastHour.getHours() - 1); 

let query = { 
    "last_used": { 
     "$lte" : ISODate(lastHour) 
    } 
}; 

// Get account that was last used at least an hour ago 
AccountModel.findOne(query, function(err, account) { 
    if(err) throw new Error(err); 
    console.log(account); 
}); 

Modelle/AccountModel.js

import Mongoose from 'mongoose'; 

export default Mongoose.model('Account', new Mongoose.Schema({ 
    email: { type: String, required: true, unique: true }, 
    password: { type: String, required: true }, 
    username: { type: String, required: true, unique: true }, 
    date_added: { type: Date, default: Date.now }, 
    last_used: { type: Date, default: Date.now } } 
)); 

db.accounts.find()

{ 
    "_id" : ObjectId("574555d0348bc17a1ab67f2c"), 
    "username" : "testuser", 
    "email" : "[email protected]", 
    "password" : "SOMEHASH", 
    "last_used" : ISODate("2016-05-24T08:13:41.080Z"), 
    "date_added" : ISODate("2016-05-24T07:35:44.121Z"), 
    "__v" : 0 
} 

Die erste Abfrage das Ergebnis zieht oben werden soll, weil es eine Stunde zugegriffen vor mehr als zuletzt.

Irgendwelche Ideen auf denen ich falsch liege?

+0

Haben Sie 'neues Datum (lastHour)' 'in der Suchabfrage probiert? – Shrabanee

+0

Keine Notwendigkeit, die JS-Datumsinstanz mit 'ISODate' zu umbrechen, da 'new Date()' das aktuelle Datum als ein Date-Objekt zurückgibt, das das ISO-Datumsformat unterstützt, einfach mit diesem Datum abfragen 'lassen Sie query = {"last_used": { "$ lte": lastHour}}; ' – chridam

+0

@chridam das gleiche Problem, funktioniert immer noch nicht. – love2node

Antwort

0

Versuchen Sie den folgenden Code.

Statt können Sie moment().subtract()moment.js subtract verwenden. Was wird einfacher sein, Berechnungen zu machen.

import AccountModel from '../Models/Account'; 

var moment = require('moment'); 
let lastHour = moment().subtract(1, 'hour') 

let query = { 
    "last_used": { 
    "$lte" : new Date(lastHour) 
    } 
}; 

// Get account that was last used at least an hour ago 
AccountModel.findOne(query, function(err, account) { 
    if(err) throw new Error(err); 
    console.log(account); 
}); 
+1

Das erzeugt auch null. Ich habe ursprünglich "Date" verwendet. Ist 'LastHour' nicht schon ein Date-Objekt? – love2node

+1

@ love2node Wie bereits erwähnt, muss das Datumsobjekt nicht umschlossen werden, da es bereits als ISODate mit JS unterstützt wird. Sie können die momentjs-Bibliothek für einfachere Datumsmanipulationen verwenden. – chridam

+1

@chridam 'Moment(). Subtrahieren (1, 'Stunden')' ist viel besser :) Obwohl, immer noch Null zurückgibt. Wirklich verwirrend. – love2node

0

Für den Datumsvergleich können Sie den folgenden Code verwenden.

let oneHour = 60 * 60 * 1000; 
let now = Date.now(); 
let comaparisonDate = new Date(now-oneHour); 

let query = { 
    "last_used": { 
     "$lte" : comaparisonDate 
    } 
}; 
Verwandte Themen