27

このドキュメント形式を持つデータベースにクエリを実行しようとしています:

{
  "_id" : ObjectId("520b8b3f8bd94741bf006033"),
  "value" : 0.664,
  "timestamp" : ISODate("2013-08-14T13:48:35Z"),
  "cr" : ISODate("2013-08-14T13:50:55.834Z")
}

次のクエリを使用して、日時から最後のレコードを取得できます。

db.mycol.find({timestamp:{$gt: ISODate("2013-08-14T13:48:00Z")}}).sort({x:1});

しかし、18 分前の値フィールドとタイムスタンプのセットを取得しようとしています。

4

5 に答える 5

69

18 分の部分では、実際には MongoDB についてではなく、JavaScript と mongo シェルで利用できるものについてです。

query = {
    timestamp: { // 18 minutes ago (from now)
        $gt: new Date(ISODate().getTime() - 1000 * 60 * 18)
    }
}

mongo シェルで動作しますが、他の言語で Mongo ドライバーを使用する場合はまったく異なります。

値とタイムスタンプの両方を使用して、より小さなスキーマに「射影」するには:

projection = {
    _id: 0,
    value: 1,
    timestamp: 1,
}

両方を適用する:

db.mycol.find(query, projection).sort({timestamp: 1});

まあ、重複があるかもしれないので、それはまだ「セット」ではありません。それらを取り除くには$group、集約フレームワークの を使用できます。

db.mycol.aggregate([
    {$match: query},
    {$group: {
        _id: {
            value: "$value",
            timestamp: "$timestamp",
        }
    }},
    {$project: {
        value: "$_id.value",
        timestamp: "$_id.timestamp",
    }},
    {$sort: {timestamp: 1}},
])
于 2013-08-14T14:46:15.430 に答える
7

以下で行うこともできます

  db.getCollection('collectionName').find({timestamp : {$gte: new Date().getTime()-(60*60*1000) } } )

上記のクエリは、タイムスタンプ b/w now と 60 mins のレコードを提供します。60 分以上が必要な場合 - たとえば 2 時間の場合、式を (2*60*60*1000) に変更して 30 分 (30*60*1000) にすることができます。

于 2020-02-18T21:49:58.380 に答える