28

私のdailyコレクションには、次のようなドキュメントがあります。

..
{ "date" : ISODate("2013-01-03T00:00:00Z"), "vid" : "ED", "san" : 7046.25, "izm" : 1243.96 }
{ "date" : ISODate("2013-01-03T00:00:00Z"), "vid" : "UA", "san" : 0, "izm" : 0 }
{ "date" : ISODate("2013-01-03T00:00:00Z"), "vid" : "PAL", "san" : 0, "izm" : 169.9 }
{ "date" : ISODate("2013-01-03T00:00:00Z"), "vid" : "PAL", "san" : 0, "izm" : 0 }
{ "date" : ISODate("2013-01-03T00:00:00Z"), "vid" : "CTA_TR", "san" : 0, "izm" : 0 }
{ "date" : ISODate("2013-01-04T00:00:00Z"), "vid" : "CAD", "san" : 0, "izm" : 169.9 }
{ "date" : ISODate("2013-01-04T00:00:00Z"), "vid" : "INT", "san" : 0, "izm" : 169.9 }
...

ここでスペースを確保するために_idフィールドを省略しました。私の仕事は、「過去 15 日以内にすべてのドキュメントを取得する」ことです。ご覧のとおり、次のことが必要です。

  1. 15 のユニークな日付を取得します。最新のものは、コレクション内の最新のドキュメントとして取得する必要があります (つまり、今日の日付は必要ありません。日付フィールドに基づいたコレクション内の最新のものです)。クエリで最も古い日を厳密に定義するには、私が何を意味するか知っていれば、最新の日から始まるある種のトップ 15 が必要です。15のユニークな日のように。
  2. db.daily.find()日付フィールドが 15 日の範囲にあるすべてのドキュメント。

その結果、コレクションの最新のものから 15 日以内にすべてのドキュメントが表示されるはずです。

4

3 に答える 3

74

データ サンプルに対して次のクエリをテストしたところ、完全に機能しました。

db.datecol.find(
{
    "date": 
    {
        $gte: new Date((new Date().getTime() - (15 * 24 * 60 * 60 * 1000)))
    }
}
).sort({ "date": -1 })
于 2013-04-22T01:33:40.033 に答える
0

一意の日付をすべて取得するには、 distinctコマンドを実行する必要があります。以下に例を示します。「values」配列には、クライアント側で最新の 15 日間を取得する必要があるコレクションの一意の日付がすべて含まれています。

db.runCommand ( { distinct: 'datecol', key: 'date' } )
{
    "values" : [
       ISODate("2013-01-03T00:00:00Z"),
       ISODate("2013-01-04T00:00:00Z")
    ],
    "stats" : {
       "n" : 2,
       "nscanned" : 2,
       "nscannedObjects" : 2,
       "timems" : 0,
       "cursor" : "BasicCursor"
    },
    "ok" : 1
}

次に、ステップ 1 の最新の 15 の日付で$in演算子を使用します。以下は、前述の 2 つの日付のいずれかに属するすべてのドキュメントを検索する例です。

db.datecol.find({
  "date":{
     "$in":[
        new ISODate("2013-01-03T00:00:00Z"), 
        new ISODate("2013-01-04T00:00:00Z")
      ]
  }
})
于 2013-04-28T20:00:03.323 に答える