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 每次添加订单时都会更新,但我希望更改我的查询中的日期范围(> 2 个订单在 2013-02-01 和 2013-02-09 之间例如)。有没有有效的方法来做到这一点?

4

1 回答 1

1

我要说你可以使用$size运算符(http://docs.mongodb.org/manual/reference/operator/size/)但是你想要一个带时间括号的数组元素计数,这意味着其中一些元素不会出现您正在寻找的时间。

一种方法是使用聚合框架:

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 回答