1

私が持っていると仮定します:

> db.users.save({name: 'John', orders:[{price: 10, date: new Date('Feb 2, 2013')}, {price: 5, date: new Date('Feb 14, 2013')}]});
> db.users.save({name: 'Tim', orders:[{price: 15, date: new Date('Jan 27, 2013')}, {price: 5, date: new Date('Feb 8, 2013')}]});

「2013 年 2 月に少なくとも 2 件の注文があるすべてのユーザー」を見つけるためのベスト プラクティスは何ですか?

$where 演算子を使用して、作業を行う JS 関数を作成できると思いますが、アプリのパフォーマンス キラーになるのではないかと心配しています。

また、ユーザーの新しいフィールドを計算することもできます: Feb2013OrdersCnt 注文が追加されるたびに更新されますが、クエリの日付範囲を変更したいと思います (2013-02-01 と 2013-02-09 の間の 2 件以上の注文)例えば)。これを行う効率的な方法はありますか?

4

1 に答える 1

1

$size演算子(http://docs.mongodb.org/manual/reference/operator/size/ )を使用できると言いましたが、配列要素の時間括弧で囲まれたカウントが必要です。これは、これらの要素の一部が表示されないことを意味します。あなたが探している時間のために。

1つの方法は、集約フレームワークを使用することです。

db.users.aggregate([
    {$unwind: '$orders'},
    {$match: {'orders.date': {$gte: new Date('01-02-2013'), $lt: new Date('01-03-2013') }}},
    {$group: {_id: '$name', sum_orders: {$sum: 1}}},
    {$match: {sum_orders: {$gte: 2}}}
])

これは大まかに次のように解釈されます。2013年2月に少なくとも2つの注文があるすべてのユーザー

それが役に立てば幸い、

編集

パフォーマンス上の理由から、の前に日付の一致を追加して$unwind、探している範囲の注文がない顧客を除外することをお勧めします。

于 2013-02-13T14:31:29.400 に答える