MongoDB:在给定行之前和之后按顺序返回行?
在MongoDB中,如果有一个find()操作符返回一组行的游标,那么返回“上下文”行(即集合中每行之前和/或之后的行)的惯用且高效的方式是什么 对我来说,解释这个概念最简单的方法是使用,它支持上下文搜索。给定一个文件:MongoDB:在给定行之前和之后按顺序返回行?,mongodb,search,find,database,Mongodb,Search,Find,Database,在MongoDB中,如果有一个find()操作符返回一组行的游标,那么返回“上下文”行(即集合中每行之前和/或之后的行)的惯用且高效的方式是什么 对我来说,解释这个概念最简单的方法是使用,它支持上下文搜索。给定一个文件: line 1 line 2 line 3 line 4 line 5 line 6 line 7 line 8 这是ack的输出: C:\temp>ack.pl -C 2 "line 4" test.txt line 2 line 3 line 4 line 5 lin
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
这是ack的输出:
C:\temp>ack.pl -C 2 "line 4" test.txt
line 2
line 3
line 4
line 5
line 6
我将日志数据存储在MongoDB集合中,每行一个文档。每个日志都被标记为关键字,这些关键字被编入索引,这给了我廉价的全文搜索
我执行bog标准:
collection.find({keywords: {'$all': ['key1', 'key2']}}, {}).sort({datetime: -1});
并获取一个光标。在此阶段,在不添加任何其他字段的情况下,获取上下文的方法是什么?我认为流程是这样的:
- 对于光标中的每一行:
- 获取_id字段,存储到x中
- execute:collection.find({u id:{'$gt':x}}).limit(N)
- 从每个游标获取结果
- execute:collection.find({u-id:{'$lt':x}}).sort({u-id:1}).limit(N)
- 从每个游标获取结果
_id, contents, keywords
我将添加一个附加字段:
_id, contents, keywords, context_ids
然后在随后的搜索中,我可以,不知何故,使用这些上下文ID,我想?我对MongoDB MapReduce一点也不熟悉,但这也会出现吗
我认为最直接的方法是在每一行中存储实际上下文行的全文,但这对我来说似乎有点粗糙。明显的优点是,单个查询可以返回我需要的上下文
我感谢所有能接受问题范围的答案。我意识到我可以在带外使用Lucene或真正的全文搜索引擎,但我正在尝试摸清MongoDB的优势和功能,因此我很欣赏MongoDB的具体答案。谢谢 我认为您存储
上下文\u id
之类的方法可能是最好的选择。如果您能够存储所需的所有上下文行的上下文\u id
(假设它是一个固定大小的上下文,比如前后5行),那么您可以使用$in
查询所有上下文行:
# pseudocode
for each matching row:
context_rows = db.logs.find({_id: {$in: row['context_ids']}}).sort({_id: 1})
row_with_context = [context_rows_before_row] + row + [context_rows_after_row]
我认为了解上下文行的集合——特别是您正在考虑的行之后的行——可能很困难,因为任何给定行之后的行都不一定存在
另一种可以避免此问题的方法(但仍然需要一个固定的、提前知道的上下文量)是将第一行上下文的_id存储在相关行之前(即,插入时,您可以缓冲前面的N行,其中N是上下文量)--首先调用这个上下文\u id
--然后像这样查询:
# pseudocode
for each matching row:
rows_with_context = db.logs.find({_id: {$gte: row['first_context_id']}}).sort({_id: 1}).limit(N * 2 + 1)
这还可以简化应用程序逻辑,因为您不需要将上下文与相关行重新组合,此查询将返回匹配的行和上下文行