170

特定の日付を照会することは可能ですか?

私はmongoクックブックで、範囲に対してそれを行うことができることを発見しましたそのような日付範囲のクエリ :

db.posts.find({"created_on": {"$gte": start, "$lt": end}})

しかし、特定の日付は可能ですか?これは機能しません:

db.posts.find({"created_on": new Date(2012, 7, 14) })
4

10 に答える 10

260

DBに保存した日付に時間がない場合(年、月、日のみ)、これは機能するはずです。

保存した日付new Date()は、時間コンポーネントを含む可能性があります。それらの時間を照会するには、1日のすべての瞬間を含む日付範囲を作成する必要があります。

db.posts.find({ //query today up to tonight
    created_on: {
        $gte: new Date(2012, 7, 14), 
        $lt: new Date(2012, 7, 15)
    }
})
于 2012-08-15T16:40:06.023 に答える
166

...5年以上後、代わりにdate-fnsを使用することを強くお勧めします

import endOfDayfrom 'date-fns/endOfDay'
import startOfDay from 'date-fns/startOfDay'

MyModel.find({
  createdAt: {
    $gte: startOfDay(new Date()),
    $lte: endOfDay(new Date())
  }
})

Moment.jsを使用している私たちにとって

const moment = require('moment')

const today = moment().startOf('day')

MyModel.find({
  createdAt: {
    $gte: today.toDate(),
    $lte: moment(today).endOf('day').toDate()
  }
})

重要:すべての瞬間は変更可能です!

tomorrow = today.add(1, 'days')も変異するため機能しませんtoday。を呼び出すmoment(today)と、暗黙的にクローンを作成することでその問題が解決され todayます。

于 2014-12-24T18:40:09.383 に答える
13

ええ、Date オブジェクトは日付と時刻を補完するため、日付値だけと比較しても機能しません。

$where演算子を使用するだけで、より複雑な条件を Javascript ブール式で表現できます:)

db.posts.find({ '$where': 'this.created_on.toJSON().slice(0, 10) == "2012-07-14"' })

created_onは日時フィールドで2012-07-14、指定された日付です。

日付は正確にYYYY-MM-DD形式にする必要があります。

注:$where慎重に使用してください。パフォーマンスに影響します。

于 2014-01-03T19:26:08.550 に答える
10

やってみました:

db.posts.find({"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})

ここで直面する問題は、Mongo では日付がタイムスタンプとして保存されることです。したがって、日付を一致させるには、タイムスタンプを一致させるように求めています。あなたの場合、1日を一致させようとしていると思います(つまり、特定の日付の00:00から23:59まで)。日付が時間なしで保存されている場合は、問題ありません。それ以外の場合、gte が機能しない場合は、日付を同じ日の時間の範囲 (つまり、開始 = 00:00、終了 = 23:59) として指定してみてください。

同様の質問

于 2012-08-15T16:48:49.190 に答える
6

API メソッドに次のアプローチを使用して、特定の日の結果を取得できます。

# [HTTP GET]
getMeals: (req, res) ->
  options = {}
  # eg. api/v1/meals?date=Tue+Jan+13+2015+00%3A00%3A00+GMT%2B0100+(CET)
  if req.query.date?
    date = new Date req.query.date
    date.setHours 0, 0, 0, 0
    endDate = new Date date
    endDate.setHours 23, 59, 59, 59
    options.date =
      $lt: endDate
      $gte: date

  Meal.find options, (err, meals) ->
      if err or not meals
        handleError err, meals, res
      else
        res.json createJSON meals, null, 'meals'
于 2015-01-14T21:57:00.837 に答える
1

データベース内の重複データに関連する問題があり、日付フィールドに 1 のはずの複数の値が含まれていました。参照用に問題を解決した方法を追加すると思いました。

数値の「値」フィールドと日付の「日付」フィールドを持つ「データ」というコレクションがあります。冪等と思われるプロセスがありましたが、2 回目の実行で 1 日あたり 2 x の値を追加することになりました。

{ "_id" : "1", "type":"x", "value":1.23, date : ISODate("2013-05-21T08:00:00Z")}
{ "_id" : "2", "type":"x", "value":1.23, date : ISODate("2013-05-21T17:00:00Z")}

2 つのレコードのうち 1 つしか必要ないため、javascript を使用してデータベースをクリーンアップする必要がありました。私たちの最初のアプローチは、結果を繰り返し処理し、午前 6 時から午前 11 時までの時間のフィールドを削除することでした (重複はすべて午前中にありました) が、実装中に変更が加えられました。これを修正するために使用されるスクリプトは次のとおりです。

var data = db.data.find({"type" : "x"})
var found = [];
while (data.hasNext()){
    var datum = data.next();
    var rdate = datum.date;
    // instead of the next set of conditions, we could have just used rdate.getHour() and checked if it was in the morning, but this approach was slightly better...
    if (typeof found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] !== "undefined") {
       if (datum.value != found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()]) {
           print("DISCREPENCY!!!: " + datum._id + " for date " + datum.date);
       }
       else {
           print("Removing " + datum._id);
           db.data.remove({ "_id": datum._id});
       }
    }
    else {
       found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] = datum.value;
    }
}

そしてそれを実行しましたmongo thedatabase fixer_script.js

于 2013-05-23T08:50:21.880 に答える
0

どの答えもうまくいかなかったようです。誰かがちょっとしたヒントに言及しましたが、私は以下のコードでうまく動作させることができました。

let endDate = startingDate
endDate = endDate + 'T23:59:59';

Model.find({dateCreated: {$gte: startingDate, $lte: endDate}})

startingDateクエリを実行する特定の日付になります。

インストールを回避し、郵便配達員で同様momentのものを渡すだけのこのソリューションを好みました。startingDate"2021-04-01"

于 2021-04-01T15:28:27.243 に答える