512

私はmongodb内につぶやきを保存して遊んでいます.各オブジェクトは次のようになります:

{
"_id" : ObjectId("4c02c58de500fe1be1000005"),
"contributors" : null,
"text" : "Hello world",
"user" : {
    "following" : null,
    "followers_count" : 5,
    "utc_offset" : null,
    "location" : "",
    "profile_text_color" : "000000",
    "friends_count" : 11,
    "profile_link_color" : "0000ff",
    "verified" : false,
    "protected" : false,
    "url" : null,
    "contributors_enabled" : false,
    "created_at" : "Sun May 30 18:47:06 +0000 2010",
    "geo_enabled" : false,
    "profile_sidebar_border_color" : "87bc44",
    "statuses_count" : 13,
    "favourites_count" : 0,
    "description" : "",
    "notifications" : null,
    "profile_background_tile" : false,
    "lang" : "en",
    "id" : 149978111,
    "time_zone" : null,
    "profile_sidebar_fill_color" : "e0ff92"
},
"geo" : null,
"coordinates" : null,
"in_reply_to_user_id" : 149183152,
"place" : null,
"created_at" : "Sun May 30 20:07:35 +0000 2010",
"source" : "web",
"in_reply_to_status_id" : {
    "floatApprox" : 15061797850
},
"truncated" : false,
"favorited" : false,
"id" : {
    "floatApprox" : 15061838001
}

created_atをチェックして18:47 から 19:00 までのすべてのオブジェクトを検索するクエリを作成するにはどうすればよいですか? 日付が特定の形式で保存されるように、ドキュメントを更新する必要がありますか?

4

16 に答える 16

779

MongoDBクックブックで日付範囲(特定の月または日)をすると、この問題について非常に良い説明がありますが、以下は私が自分で試したもので、うまくいくようです.

items.save({
    name: "example",
    created_at: ISODate("2010-04-30T00:00:00.000Z")
})
items.find({
    created_at: {
        $gte: ISODate("2010-04-29T00:00:00.000Z"),
        $lt: ISODate("2010-05-01T00:00:00.000Z")
    }
})
=> { "_id" : ObjectId("4c0791e2b9ec877893f3363b"), "name" : "example", "created_at" : "Sun May 30 2010 00:00:00 GMT+0300 (EEST)" }

私の実験に基づいて、MongoDB がサポートする形式に日付をシリアル化する必要があります。これは、次の結果が望ましくないためです。

items.save({
    name: "example",
    created_at: "Sun May 30 18.49:00 +0000 2010"
})
items.find({
    created_at: {
        $gte:"Mon May 30 18:47:00 +0000 2015",
        $lt: "Sun May 30 20:40:36 +0000 2010"
    }
})
=> { "_id" : ObjectId("4c079123b9ec877893f33638"), "name" : "example", "created_at" : "Sun May 30 18.49:00 +0000 2010" }

2 番目の例では、結果は予期されていませんでしたが、結果は得られました。これは、基本的な文字列比較が行われるためです。

于 2010-05-31T13:04:14.557 に答える
44

明確にするために。知っておくべき重要なことは、次のことです。

  • はい、Javascript Date オブジェクトを渡す必要があります。
  • はい、ISODate に対応している必要があります
  • はい、これを機能させる私の経験から、日付をISOに操作する必要があります
  • はい、日付の操作は通常、常に退屈なプロセスであり、mongo も例外ではありません。

ここでは、Mongo (ここでは mongoose モジュールを使用しており、日付属性が myDate パラメータとして指定された日付より前 (前) の日付属性を持つ行の結果が必要です) が処理できるように、少し日付操作を行うコードのスニペットを示します。それは正しく:

var inputDate = new Date(myDate.toISOString());
MyModel.find({
    'date': { $lte: inputDate }
})
于 2014-07-30T15:21:30.477 に答える
20

MongoDB は、 http ://bsonspec.org/#/specification で規定されているように、実際には日付のミリ単位を int(64) として格納します。

ただし、クライアント ドライバーが独自のローカル タイムゾーンを使用して日付オブジェクトをインスタンス化するため、日付を取得するときにかなり混乱する可能性があります。mongo コンソールの JavaScript ドライバーは確かにこれを行います。

そのため、タイムゾーンが気になる場合は、戻ってきたときにタイムゾーンがどうあるべきかを確認してください. これは、日付オブジェクトがどのタイムゾーンにあるかに関係なく、同じ int(64) に相当するため、クエリにとってはそれほど重要ではありません (願っています)。しかし、私は間違いなく実際の日付オブジェクト (文字列ではなく) を使用してクエリを作成し、ドライバーに任せます。

于 2010-06-03T20:22:54.290 に答える
2

日付をMongoに詰め込むときに、日付をGMTタイムゾーンに変換します。そうすれば、タイムゾーンの問題は決してありません。次に、プレゼンテーションのためにデータを引き出すときに、twitter/timezone フィールドで計算を行うだけです。

于 2014-01-16T15:45:08.943 に答える
2
mongoose.model('ModelName').aggregate([
    {
        $match: {
            userId: mongoose.Types.ObjectId(userId)
        }
    },
    {
        $project: {
            dataList: {
              $filter: {
                 input: "$dataList",
                 as: "item",
                 cond: { 
                    $and: [
                        {
                            $gte: [ "$$item.dateTime", new Date(`2017-01-01T00:00:00.000Z`) ]
                        },
                        {
                            $lte: [ "$$item.dateTime", new Date(`2019-12-01T00:00:00.000Z`) ]
                        },
                    ]
                 }
              }
           }
        }
     }
])
于 2019-07-26T15:36:13.513 に答える
0

Scala: Joda DateTime および BSON 構文 (reactivemongo) を使用:

val queryDateRangeForOneField = (start: DateTime, end: DateTime) =>
    BSONDocument(
      "created_at" -> BSONDocument(
        "$gte" -> BSONDateTime(start.millisOfDay().withMinimumValue().getMillis), 
        "$lte" -> BSONDateTime(end.millisOfDay().withMaximumValue().getMillis)),
     )

ここでmillisOfDay().withMinimumValue()、「2021-09-08T06:42:51.697Z」は「2021-09-08T00:00:00.000Z」になり、millisOfDay(). withMaximumValue()「2021-09-08T06:42:51.697Z」は「2021-09-」になります08T23:59:99.999Z」

于 2021-09-06T08:26:03.547 に答える
-1

私は自分の要件に従ってこのモデルを試しました オブジェクトが後で作成されるたびに日付を保存する必要があります HTMLファイルの2つの日付の間のすべてのレコード(ドキュメント)を取得したい 私は次の形式mm/dd/yyyyを使用していました

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>

    <script>
//jquery
    $(document).ready(function(){  
    $("#select_date").click(function() { 
    $.ajax({
    type: "post",
    url: "xxx", 
    datatype: "html",
    data: $("#period").serialize(),  
    success: function(data){
    alert(data);
    } ,//success

    }); //event triggered

    });//ajax
    });//jquery  
    </script>

    <title></title>
</head>

<body>
    <form id="period" name='period'>
        from <input id="selecteddate" name="selecteddate1" type="text"> to 
        <input id="select_date" type="button" value="selected">
    </form>
</body>
</html>

私のpy(python)ファイルで、次の方法で「iso fomate」に変換しました

date_str1   = request.POST["SelectedDate1"] 
SelectedDate1   = datetime.datetime.strptime(date_str1, '%m/%d/%Y').isoformat()

コレクションのフィールドとして「SelectedDate」を使用してdbmongoコレクションに保存しました

次のクエリで使用した 2 つの日付の間のデータまたはドキュメントを取得する

db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}})
于 2013-12-04T11:29:29.350 に答える