【发布时间】:2017-07-02 15:12:25
【问题描述】:
我想在某些条件下检索包含指定记录的列表,并且只检索该记录之前的一些记录和该记录之后的一些记录。有什么解决办法吗?
例如,我有一个 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
我有一个愚蠢的方法:
- 通过 A 部分获取指定 id = 300 的日期(假设是 2014 年 9 月 26 日 12:00)
- 设置查询以查找日期大于等于 2014 年 9 月 26 日 12:00 的记录,按日期排序,限制为 3 条记录。
- 设置查询以查找日期小于 2014 年 9 月 26 日 12:00 的记录,按日期排序,限制为 3 条记录。
- 合并两个列表。
有没有更好的方法来在查询中检索这种列表或获得更好的性能?谢谢。
【问题讨论】:
-
id 与日期的方向是否相同?例如,id(300) > id(290),然后 date(300) >= date(290)。而且,是否有可能为不同的 id 重复日期?
-
@Wizard id 是唯一的,假设可以将新记录插入为 {610, 26 Oct 2014 00:00, A}
-
因此,不可能通过 id 在一个查询中找到,因为日期未知。您的方法应该适合这种情况,您可以通过添加索引来提高性能,例如
{section:1, date:1, id:1}。 -
请更准确地定义排序是什么。什么定义之前或之后?是
_ids 吗?是按时间顺序吗?如果它是按时间顺序排列的,那么要找到一个给定文档的间隔,其范围由其中的文档数量决定,你将不得不采用你的“愚蠢”方法(我认为这并不愚蠢)。但是您可能还需要考虑一种具有更自然限制的不同类型的查询,例如根据您的用例按开始和结束日期定义范围。 -
@Wizard 谢谢。然后我将实施我的方法并设置有点索引
标签: mongodb mongodb-query