私は次のモンゴに相当するものを探しています:
select distinct event_type_id from events
order by created_at desc
limit 10,20
EventMongoドキュメントは次のとおりです。
{
_id: BSON(), event_type_id: 1, created_at: Date(), other_data: {}
}
新しいmongoバージョンでAggregationFrameworkを使用できます。開始する例は次のとおりです。
db.events.aggregate([
{$sort:{"created_at":-1}},
{$project:{"event_type_id":1}},
{$group:{"_id":"$event_type_id"}},
{$skip:10},
{$limit:20}
])
@JoachimIsakssonのおかげで、別のアプローチがあります
db.events.aggregate([
{$group:{"_id":"$event_type_id", "created_at":{$max:"$created_at"}}},
{$sort:{"created_at":-1}},
{$skip:10},
{$limit:20},
{$project:{"event_type_id":1}}
])
これは、v2.2で導入された集約フレームワークを介していつでも実行できます。
db.col.aggregate(
{$group: {_id: "$event_type_id", created_at: "$created_at"}},
($sort: {"$created_at":-1}
);
そのようなものがグループ化されます。これは、実際には個別の値と同じであり、すべてのevent_type_id
値をcreated_at
降順で並べ替えます。
これは問題ないはずですが、現時点では16メガの出力制限(atm)があるため、巨大なドキュメントを出力しようとすると難しい場合があることに注意してください。
パフォーマンスのために、実際に最初にインデックスを使用してソートを実行し、次に$group
:
db.col.aggregate(
{ $sort: {"$created_at":-1} },
{ $group: {_id: "$event_type_id", created_at: {$first: "$created_at"}} }
);
これは、$first
(http://docs.mongodb.org/manual/reference/aggregation/first/)演算子を使用して、このグループのそのフィールドの最初の値を取得します。$last
演算子を使用することもできます。もちろん、これらは通常$min
の変換に変換$max
されますが、ソートされたセットの場合です。
制限コマンドとスキップコマンドをmongoの個別のクエリと組み合わせることができるとは思いません。次のコードは、次のsqlステートメントと同等のものを返します。
select distinct event_type_id from events
order by created_at desc
db.events.distinct( 'event_type_id', {}, {{createdAt: -1} })
結果を取得した後、必要に応じてサブセットを抽出できます。また、次の投稿も確認してください:mongodbでDistinct、Sort、limitを使用する方法
どうやらこれはmongoコミュニティのオープンチケットです。問題も確認できます。しばらくの間、制限と個別の組み合わせを実装しないようですhttps://jira.mongodb.org/browse/SERVER-2130