5

私は次のモンゴに相当するものを探しています:

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: {}
}
4

3 に答える 3

8

新しい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}}
])
于 2013-01-10T22:22:59.163 に答える
2

これは、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"}} }
);

これは、$firsthttp://docs.mongodb.org/manual/reference/aggregation/first/)演算子を使用して、このグループのそのフィールドの最初の値を取得します。$last演算子を使用することもできます。もちろん、これらは通常$minの変換に変換$maxされますが、ソートされたセットの場合です。

于 2013-01-10T22:18:34.580 に答える
0

制限コマンドとスキップコマンドを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

于 2013-01-10T22:10:03.980 に答える