日付に基づいてクエリを返す


209

mongodbにこのようなデータがあります

{ 
    "latitude" : "", 
    "longitude" : "", 
    "course" : "", 
    "battery" : "0", 
    "imei" : "0", 
    "altitude" : "F:3.82V", 
    "mcc" : "07", 
    "mnc" : "007B", 
    "lac" : "2A83", 
    "_id" : ObjectId("4f0eb2c406ab6a9d4d000003"), 
    "createdAt" : ISODate("2012-01-12T20:15:31Z") 
}

クエリを実行db.gpsdatas.find({'createdAt': ??what here??})して、上記のデータ結果をデータベースから返すにはどうすればよいですか?


どのnodejsライブラリを使用しているかを言及することは効果的でしたが、例に基づいて、それは
mongoosejsの

回答:


421

たとえば、範囲クエリを実行する必要がある場合があります。たとえば、特定の日付の後に作成されたすべてのアイテム:

db.gpsdatas.find({"createdAt" : { $gte : new ISODate("2012-01-12T20:15:31Z") }});

私は$gte(以上)を使用しています。これは、時間コンポーネントが00:00:00である日付のみのクエリによく使用されるためです。

別の日付と等しい日付を本当に見つけたい場合、構文は次のようになります。

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });

14
Ahh :) Mongoコンソールを使用していると思いました。そこでISODateは、js Dateオブジェクトのラッパーがあります。のようなものを試してください"createdAt" : new Date("2010-01-01")。ただし、何らかの理由で、そのコードはMongoコンソールでは機能しませ(v 2.0.2の場合)。
mnemosyn 2012年

日付の初期化ではダッシュの代わりにスラッシュを使用しますか?このように:new Date("2010/01/01");
ビクターS

16

その日付のどこかにアイテムを取得したい場合は、2つの日付を比較する必要があります

このように最初の日付から2つの日付を作成して、その日の開始と終了を取得できます。

var startDate = new Date(); // this is the starting date that looks like ISODate("2014-10-03T04:00:00.188Z")

startDate.setSeconds(0);
startDate.setHours(0);
startDate.setMinutes(0);

var dateMidnight = new Date(startDate);
dateMidnight.setHours(23);
dateMidnight.setMinutes(59);
dateMidnight.setSeconds(59);

### MONGO QUERY

var query = {
        inserted_at: {
                    $gt:morning,
                    $lt:dateScrapedMidnight
        }
};

//MORNING: Sun Oct 12 2014 00:00:00 GMT-0400 (EDT)
//MIDNIGHT: Sun Oct 12 2014 23:59:59 GMT-0400 (EDT)

16

Mongo v3.2.3でNode v0.12.7およびv4.4.4を使用して同様のものを実装し、使用しました。

{ $gte: new Date(dateVar).toISOString() }

ISODate(例:2016-04-22T00:00:00Z)を渡していますが、これはtoISOString関数の有無にかかわらず.find()クエリで機能します。しかし、.aggregate()$ matchクエリで使用する場合、toISOString関数は好きではありません!


12

過去5分間にすべて新しいものを取得したい場合は、いくつかの計算を行う必要がありますが、難しくありません...

最初に、照合するプロパティにインデックスを作成します(降順の場合は並べ替え方向-1、昇順の場合は1)

db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt

次に、最後の5分間(60秒* 5分)に作成されたドキュメントをクエリします.getTime()。JavaScriptはミリ秒を返すため、new Date()コンストラクタへの入力として使用する前に1000を乗算する必要があります。

db.things.find({
        createdAt: {
            $gte: new Date(new Date().getTime()-60*5*1000).toISOString()
         }
     })
     .count()

の説明new Date(new Date().getTime()-60*5*1000).toISOString()は次のとおりです。

まず、「5分前」を計算します。

  1. new Date().getTime() 現在の時間をミリ秒で示します
  2. それから5分(ミリ秒単位)を差し引きます。- 簡単に変更できるように秒を5*60*1000掛けるだけ60です。私は変更することができます5120、私は2時間(120分)をしたい場合。
  3. new Date().getTime()-60*5*1000私たちに与える1484383878676(5分前ms)

次に、それをnew Date()コンストラクタにフィードして、MongoDBタイムスタンプで必要なISO文字列形式を取得する必要があります。

  1. { $gte: new Date(resultFromAbove).toISOString() } (mongodb .find()クエリ)
  2. 変数を持つことはできないので、すべてを一度に実行します。 new Date(new Date().getTime()-60*5*1000)
  3. ...次にISO文字列に変換します。 .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() くれます 2017-01-14T08:53:17.586Z

もちろん、node-mongodb-nativeドライバーを使用している場合、変数を使用するとこれは少し簡単になりますが、これは、物事をチェックするために通常使用するmongoシェルで機能します。


1
私はあなたが使用することができると思うDate.now()の代わりにnew Date().getTime()
Béranger

4

あなたも試すことができます:

{
    "dateProp": { $gt: new Date('06/15/2016').getTime() }
}

2

Mongooseを使用している場合は、

try {
  const data = await GPSDatas.aggregate([
    {
      $match: { createdAt : { $gt: new Date() }
    },
    {
      $sort: { createdAt: 1 }
    }
  ])
  console.log(data)

} catch(error) {
    console.log(error)
}

1

特定の日付で検索:

db.getCollection('CollectionName').find({"DepartureDate" : new ISODate("2019-06-21T00:00:00.000Z")})

大きいと検索gteまたは少しlt

db.getCollection('CollectionName').find({"DepartureDate" : { $gte : new ISODate("2019-06-11T00:00:00.000Z") }})

範囲で検索:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.