2016-05-26 24 views
2

Mongooseの使用データベースから日付に基づいてデータを選択しようとしています。私の場合、1時間以上でアクセスされていないアカウント。MongoDB日付の比較問題

クエリを実行しているとき、私は何も結果を得ていないのです。

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

はここに私のコードです:

ビン/ 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); 
}); 

モデル/ 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 
} 

最初のクエリは、それが時間以上前に最後にアクセスされたため、上記の結果を引っ張っされるべきです。

私は間違っていますか?

+0

検索クエリで 'new Date(lastHour)'を試しましたか? – Shrabanee

+0

'new date()'として 'ISODate'を使ってJS日付インスタンスをラップする必要はありません。ISO日付フォーマットをサポートするDateオブジェクトとして現在の日付を返します。' let query = {"last_used":{ "$ lte":lastHour}}; ' – chridam

+0

@chridam同じ問題は、まだ動作しません。 – love2node

答えて

0

次のコードを試してください。

ISOdateの代わりに、moment().subtract()moment.js subtractとすることができます。計算が簡単になります。

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

これもnullを生成します。私はもともと「日付」を使用していました。また、 'lastHour'は既にDateオブジェクトではありませんか? – love2node

+1

@ love2node前述したように、JSでISODateとして既にサポートされているので、日付オブジェクトをラップする必要はありません。あなたは、より簡単な日付操作のためにmomentjsライブラリを使用したいかもしれません。 – chridam

+1

@chridam 'Moment()。subtract(1、 'hours')'ははるかに優れています。本当の混乱。 – love2node

0

次のコードを使用して比較することができます。

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

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