Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB行索引限制查询,如SQL_Mongodb_Mongodb Query - Fatal编程技术网

MongoDB行索引限制查询,如SQL

MongoDB行索引限制查询,如SQL,mongodb,mongodb-query,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 2

我希望在某些条件下检索包含指定记录的列表,并且只检索该记录之前的多个记录和之后的多个记录。有什么解决办法吗

例如,我有一个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,在该id=300的记录之前有3条记录,在该记录之后有3条记录,按日期在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
我有一个愚蠢的方法:

获取日期,比如2014年9月26日12:00,指定id=300,A部分 设置查询以查找日期大于等于2014年9月26日12:00的记录,按日期排序,限制为3条记录。 设置查询以查找日期小于2014年9月26日12:00的记录,按日期排序,限制为3条记录。 合并两个列表。 有没有更好的方法可以在查询中检索此类列表或获得更好的性能?多谢各位

下面是一个使用skip and limit的好例子,它可以帮助您实现选择TOP X或limit X

注意:我假设您希望使用基于此问题标记的聚合框架

我相信这应该可以做到

x = 300;
db.user.aggregate({$match : { "id" : {$lte: x+10,$gte: x-10 }},{$sort : {"date": 1 }}});
让您的模式名为USER。您可以使用下面的mongo db查询来获取结果

$sort函数:

1代表上升 -1代表下降 请参阅文档:

查询将是:

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

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

请参阅文档:

谢谢。然而,我想你误解了我的问题。您将发现所有匹配id=300但id=300的结果实际上是唯一的,我想要得到的是id=300之前的10条记录和id=300之后的10条记录。我已经阅读了,但我正在尝试形成聚合函数。您有什么想法吗?我添加了一个示例,说明如何根据id获取范围。谢谢您的回答。但是,正如您所看到的示例所示,顺序应该是日期,而不是id,并且假设可以插入新记录为{610,2014年10月26日00:00,A}。好了,您在查询中添加了日期排序。id与日期的方向是否相同?例如,id300>id290,然后date300>=date290。另外,是否可能不同id的重复日期?@向导id是唯一的,假设新记录可以插入为{610,2014年10月26日00:00,A},那么,不可能在一个查询中按id查找,因为日期未知。对于这种情况,您的方法应该是一种很好的方法,您可以通过添加索引来提高性能,例如{section:1,date:1,id:1}。请更精确地定义排序。什么定义之前或之后?是不是??是按时间顺序吗?如果它是按时间顺序排列的,那么要找到一个给定文档的时间间隔,其范围由其中的文档数决定,您必须使用我认为并不愚蠢的愚蠢方法。但是,您也可能需要考虑一种更为自然的限制,比如根据开始和结束日期来定义范围,这取决于您的用例。@向导谢谢。然后我将实现我的方法并设置一个索引