web-dev-qa-db-ja.com

MongodbのISODateを使った日付クエリはうまくいかないようです

最も基本的な日付クエリでさえMongoDBで動作させることはできないようです。このように見える文書では:

{
    "_id" : "foobar/201310",
    "ap" : "foobar",
    "dt" : ISODate("2013-10-01T00:00:00.000Z"),
    "tl" : 375439
}

そしてこのようなクエリです:

{ 
    "dt" : { 
        "$gte" : { 
            "$date" : "2013-10-01T00:00:00.000Z"
        }
    }
}

実行から 0の結果 が得られます。

db.mycollection.find({
  "dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"}}
})

なぜこれがうまくいかないのですか?

参考までに、このクエリは Spring's MongoTemplate によって生成されているので、最終的にMongoDBに送信されるクエリを直接制御することはできません。

(P.)

> db.version()
2.4.7

ありがとうございます。

150
Jason Polites

$dateMongoDB Extended JSON の一部ですが、mongoexportを使用するとデフォルトになりますが、実際にはクエリの一部として使用できないと思います。

以下のように$dateで完全検索をしてみてください。

db.foo.find({dt: {"$date": "2012-01-01T15:00:00.000Z"}})

エラーが発生します。

error: { "$err" : "invalid operator: $date", "code" : 10068 }

これを試して:

db.mycollection.find({
    "dt" : {"$gte": new Date("2013-10-01T00:00:00.000Z")}
})

または( @ user3805045 によるコメントの後に):

db.mycollection.find({
    "dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")}
})

ISODateは時間なしで日付を比較するためにも必要とされるかもしれません( @MattMolnar で示されます)。

によると、mongo Shellのデータ型 bothは同等であるべきです。

Mongo Shellは、文字列またはDateオブジェクトとして日付を返すためのさまざまなメソッドを提供します。

  • 現在の日付を文字列として返すDate()メソッド。
  • iSODate()ラッパーを使用してDateオブジェクトを返すnew Date()コンストラクター。
  • ISODate()ラッパーを使用してDateオブジェクトを返すISODate()コンストラクター。

ISODateを使用してもDateオブジェクト が返されるはずです。

厳密なJSON表現が必要な場合は{"$date": "ISO-8601 string"}を使用できます。 1つの可能な例はHadoopコネクタです。

253
zero323

MongoDBクックブックから ページのコメント:

"dt" : 
{
    "$gte" : ISODate("2014-07-02T00:00:00Z"), 
    "$lt" : ISODate("2014-07-03T00:00:00Z") 
}

これは私のために働きました。完全なコンテキストでは、次のコマンドはdt dateフィールドの日付が2013-10-01(YYYY-MM-DD)Zuluであるすべてのレコードを取得します。

db.mycollection.find({ "dt" : { "$gte" : ISODate("2013-10-01T00:00:00Z"), "$lt" : ISODate("2013-10-02T00:00:00Z") }})
85
Steve HHH

これを試して:

{ "dt" : { "$gte" : ISODate("2013-10-01") } }
11
Jabba

JSON厳密モードでは、順序を守る必要があります。

{
    "dt": {
        "$gte": {
            "$date": "2013-10-01T00:00:00.000Z"
        }
    }
}

Mlab.comで私の検索クエリを定義するために働いた唯一のもの。

5
3vangelos

私はmongodbクライアントguiとしてrobomongoを使用していて、以下が私のために働きました

db.collectionName.find({"columnWithDateTime" : {
$lt:new ISODate("2016-02-28T00:00:00.000Z")}})

アプリ側で私はnodejsベースのドライバmongodb(v1.4.3)を使用しています、アプリケーションはYYYY-mm-ddのような日付を与えるuiで日付ピッカーを使います、そしてこれは00:00:00のようなデフォルト時間でそれから追加されそれから与えられますnew Date()コンストラクタに渡してからmongodb criteriaオブジェクトに渡すと、ドライバが日付をISO日付に変換してからクエリが機能し、望ましい出力が得られると思います。ただし、同じnew Date()コンストラクタは機能しないか、同じ出力をrobo mongoに表示します。私は自分の基準オブジェクトをクロスチェックするためにrobomongoを使ったので、同じ基準は変です。

デフォルトのcli mongoshellはISODatenew Date()の両方でうまく動作しますが

3
siddharthrc

MongoDBシェルの場合

db.getCollection('sensorevents').find({from:{$gt: new ISODate('2015-08-30 16:50:24.481Z')}})

私のnodeJSコードで(Mongooseを使って)

    SensorEvent.Model.find( {
        from: { $gt: new Date( SensorEventListener.lastSeenSensorFrom ) }
    } )

'from'フィールドが指定された日付よりも大きい値を返すように、センサーイベントコレクションに問い合わせています

2
lewma

これが私の文書です

"_id" : ObjectId("590173023c488e9a48e903d6"),
    "updatedAt" : ISODate("2017-04-27T04:26:42.709Z"),
    "createdAt" : ISODate("2017-04-27T04:26:42.709Z"),
    "flightId" : "590170f97cb84116075e2680",

 "_id" : ObjectId("590173023c488e9a48e903d6"),
        "updatedAt" : ISODate("2017-04-28T03:26:42.609Z"),
        "createdAt" : ISODate("2017-04-28T03:26:42.609Z"),
        "flightId" : "590170f97cb84116075e2680",

今、私は27日ごとのdocument.soを見つけたいと思っています。

 > db.users.find({createdAt:{"$gte":ISODate("2017-04-27T00:00:00Z"),"$lt":ISODate("2017-04-28T00:00:00Z") }}).count()

result:1

これは私のために働いた。

1
vipin sharma