0

5 年分のレコード (1 日あたり 1 つのレコード) を持つモデル (イベント) があります。2011-12-25 00:00:00 などの日付オブジェクトを渡すと、年に関係なく、12/25 に発生したすべてのレコード (:created_at 列に対してクエリを実行) を表示するメソッドが必要です。または経過した時間。

次のクエリを実行して、指定された日付の間にあるデータを取得しようとしましたが、年が変わった後、クエリでレコードを取得できないという問題が発生しました。たとえば、record sdate="1-06-2013" および edate="2-2-2014" 1 月 1 日のレコードが必要な場合、どうすればこのデータを取得できますか。

db.events.find( "this.sdate.getMonth() > 6 && this.edate.getMonth() < 6" );

ActiveRecordではなくMongoidを使用して、正確な次のクエリが必要です

Model.where("MONTH(created_at) = ? and DAY(created_at) = ?", somedate.month, somedate.day)

4

2 に答える 2

2

編集:(私の最初の答えは、年と時間を無視すべきであるという事実を見逃していました)

集計パイプラインを次のように使用します。

project = { '$project' => { 
              'day' => { '$dayOfMonth' => '$created_at' },
              'month' => { '$month' => '$created_at' }
            }
          }
match = { '$match' => { 'day' => 25, 'month' => 12 } }

Events.collection.aggregate([project, match])

これにより、予測された日と月の値と一致するイベントの _id を含むハッシュの配列が返されます。その後、それらをイベントまたはそれらで行う必要があるものにマップし直すことができます。

于 2013-09-20T13:35:14.217 に答える
0

あなたはいくつかのJavascriptingクエリを実行しようとすることができます

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

しかし、私はこれを決してしません。私がすることは、月日をフィールドに格納し、それにインデックスを付けて、より高速なクエリを実行することです。そうしないと、すべての dos をスキャンすることになります。

于 2013-09-17T21:09:16.550 に答える