MongoDB行索引限制查询,如SQL

时间:2014-08-27 04:19:40

标签: mongodb mongodb-query

我想在某些条件下检索包含指定记录的列表,并且只检索之前的一些记录以及该记录之后的一些记录。有没有解决方案?

例如,我有一个MongoDB模式{id,date,section} 数据集:

100, 26 Aug 2014 11:00, A
110, 26 Aug 2014 11:01, A
140, 26 Aug 2014 12:00, A
141, 27 Aug 2014 12:00, B
200, 30 Aug 2014 11:00, A
210, 01 Sep 2014 11:01, B
290, 02 Sep 2014 12:00, A
300, 26 Sep 2014 12:00, A
301, 27 Oct 2014 12:00, B
302, 30 Oct 2014 11:23, A
410, 01 Oct 2014 15:01, B
590, 02 Oct 2014 12:00, A
600, 26 Nov 2014 00:00, A

我想获得一个列表,其中包含一个唯一的id = 300和之前的3条记录以及该记录之后的3条记录,其中id = 300,按照A部分的日期排序。

输出:

140, 26 Aug 2014 12:00, A
200, 30 Aug 2014 11:00, A
290, 02 Sep 2014 12:00, A
300, 26 Sep 2014 12:00, A <-- middle
302, 30 Oct 2014 11:23, A
590, 02 Oct 2014 12:00, A
600, 26 Nov 2014 00:00, A

我有一个愚蠢的方法:

  1. 使用A部分获取指定id = 300的日期(假设是2014年9月26日12:00)
  2. 设置查询以查找日期大于等于2014年9月26日12:00按日期排序的记录,限制为3条记录。
  3. 设置查询以查找日期小于2014年9月26日的记录,按日期排序,受3条记录限制。
  4. 合并两个清单。
  5. 是否有更好的方法可以在查询中检索此类列表或获得更好的性能?谢谢。

2 个答案:

答案 0 :(得分:-1)

$skip and $limit in aggregation framework

以下是使用跳过和限制的一个很好的示例,它可以帮助您实现SELECT TOP XLIMIT X

注意:我假设你想根据这个问题的标记使用聚合框架。

我相信应该这样做

x = 300;
db.user.aggregate({$match : { "id" : {$lte: x+10,$gte: x-10 }},{$sort : {"date": 1 }}});

答案 1 :(得分:-1)

让您的架构名称为USER。您可以使用下面的mongo db查询来获取结果

$sort功能:

  • 1代表升序
  • -1代表降序

参考文档:$Sort Documentation

查询将是:

db.user.aggregate({$match : { "id" : 300}},{$sort : {"date": 1 }},{$skip : 0},{$limit : 10});
第一次查询后

$skip值将是您的limit

db.user.aggregate({$match : { "id" : 300}},{$sort : {"date": 1 }},{$skip : 10},{$limit : 10});

参考文档:Aggregation Documentation