52

私はmongodbを使用しており、この方法でデータベースに日時を保存します

日付「2011年11月17日18:00」の場合:

date = datetime.datetime(2011, 11, 17, 18, 0)
db.mydatabase.mycollection.insert({"date" : date})

そんなリクエストをしたいのですが

month = 11
db.mydatabase.mycollection.find({"date.month" : month})

また

day = 17
db.mydatabase.mycollection.find({"date.day" : day})

誰かがこのクエリを行う方法を知っていますか?

4

7 に答える 7

59

日付はタイムスタンプ形式で保存されます。特定の月に属するすべてのものが必要な場合は、その月の開始と終了を照会します。

var start = new Date(2010, 11, 1);
var end = new Date(2010, 11, 30);

db.posts.find({created_on: {$gte: start, $lt: end}});
//taken from http://cookbook.mongodb.org/patterns/date_range/
于 2011-11-15T13:09:24.620 に答える
32

日や月などの日付コンポーネントでmongodbコレクションを直接クエリすることはできません。しかし、特別な$ wherejavascript式を使用することで可能です

db.mydatabase.mycollection.find({$where : function() { return this.date.getMonth() == 11} })

または単に

db.mydatabase.mycollection.find({$where : 'return this.date.getMonth() == 11'})

(しかし、私は最初のものを好みます)

日付の一部を取得するには、以下のシェルコマンドを確認してください

>date = ISODate("2011-09-25T10:12:34Z")
> date.getYear()
111
> date.getMonth()
8
> date.getdate()
25

編集:

他に選択肢がない場合にのみ$whereを使用してください。パフォーマンスの問題があります。@kamaradclimberと@dcrostaによる以下のコメントをチェックしてください。他の人々がそれについての事実を知ることができるように、私はこの投稿を公開します。

詳細については、クエリの句と関数のリンク$whereを確認してください。

于 2011-11-15T13:16:16.610 に答える
13

月を照会する必要があるので、その月を独自のプロパティに格納するのはどうですか?よりエレガントではありませ$whereんが、インデックスを作成できるため、パフォーマンスが向上する可能性があります。

于 2011-11-16T05:38:25.400 に答える
11

特定の月に属するドキュメントを検索する場合は、必ず次のようにクエリを実行してください。

// Anything greater than this month and less than the next month
db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lt: new Date(2015, 7, 1)}});

以下のようなクワイアリングはできるだけ避けてください。

// This may not find document with date as the last date of the month
db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lt: new Date(2015, 6, 30)}});

// don't do this too
db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lte: new Date(2015, 6, 30)}});
于 2015-06-12T04:55:01.017 に答える
8

$exprクエリ言語内で集計式を使用できるようにする演算子を使用します。これにより、クエリで次のように日付集計演算子を使用できるようになります。

month = 11
db.mydatabase.mycollection.find({ 
    "$expr": { 
        "$eq": [ { "$month": "$date" }, month ] 
    } 
})

また

day = 17
db.mydatabase.mycollection.find({ 
    "$expr": { 
        "$eq": [ { "$dayOfMonth": "$date" }, day ] 
    } 
})

パイプラインを受け取るaggregate()関数を使用して集計操作を実行することもできます。$redact

month = 11
db.mydatabase.mycollection.aggregate([
    {
        "$redact": {
            "$cond": [
                { "$eq": [ { "$month": "$date" }, month ] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

その他のご要望は

day = 17
db.mydatabase.mycollection.aggregate([
    {
        "$redact": {
            "$cond": [
                { "$eq": [ { "$dayOfMonth": "$date" }, day ] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

ORの使用

month = 11
day = 17
db.mydatabase.mycollection.aggregate([
    {
        "$redact": {
            "$cond": [
                { 
                    "$or": [ 
                        { "$eq": [ { "$month": "$date" }, month ] },
                        { "$eq": [ { "$dayOfMonth": "$date" }, day ] }
                    ] 
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

ANDの使用

var month = 11,
    day = 17;
db.collection.aggregate([
    {
        "$redact": {
            "$cond": [
                { 
                    "$and": [ 
                        { "$eq": [ { "$month": "$createdAt" }, month ] },
                        { "$eq": [ { "$dayOfMonth": "$createdAt" }, day ] }
                    ] 
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

$redactオペレーターはパイプラインの機能を組み込み、を$project使用$matchして条件に一致するすべてのドキュメントを返し、変数$$KEEPを使用して一致しないドキュメントをパイプラインから破棄します。$$PRUNE

于 2017-02-20T12:06:41.060 に答える
5

$ dayOfYear、$ dayOfWeek、$ month、$ yearなど、日付集計演算子による日付の月、日、年などのレコードを見つけることができます。

例として、2016年4月に作成されたすべての注文が必要な場合は、以下のクエリを使用できます。

db.getCollection('orders').aggregate(
   [
     {
       $project:
         {
           doc: "$$ROOT",
           year: { $year: "$created" },
           month: { $month: "$created" },
           day: { $dayOfMonth: "$created" }
         }
     },
     { $match : { "month" : 4, "year": 2016 } }
   ]
)

ここで作成されたのは、ドキュメントの日付型フィールドです。$$ ROOTは、他のすべてのフィールドを次のステージでプロジェクトに渡し、ドキュメントのすべての詳細を提供するために使用しました。

必要に応じて上記のクエリを最適化できます。例を示すだけです。日付集約演算子の詳細については、リンクにアクセスしてください。

于 2017-02-15T07:25:59.630 に答える
-1

MongoDB_DataObjectラッパーを使用して、次のようなクエリを実行できます。

$model = new MongoDB_DataObject('orders');

$model->whereAdd('MONTH(created) = 4 AND YEAR(created) = 2016');

$model->find();

while ($model->fetch()) {
    var_dump($model);
}

または、同様に、直接クエリ文字列を使用します。

$model = new MongoDB_DataObject();

$model->query('SELECT * FROM orders WHERE MONTH(created) = 4 AND YEAR(created) = 2016');

while ($model->fetch()) {
    var_dump($model);
}
于 2017-02-16T04:49:00.987 に答える