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:在给定行之前和之后按顺序返回行?_Mongodb_Search_Find_Database - Fatal编程技术网

MongoDB:在给定行之前和之后按顺序返回行?

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

在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
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)
      • 从每个游标获取结果
对于具有R行的结果集,这需要2R+1查询

然而,我想我可以用时间来交换空间。是否有一种可行的替代方案,可以在后台用每行的上下文id更新每行?对于当前具有字段的给定行:

_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)
这还可以简化应用程序逻辑,因为您不需要将上下文与相关行重新组合,此查询将返回匹配的行和上下文行