8

我正在尝试存储大量双重链接的文档,即它们可以有一个前任和一个后继。由于存在不同文档的集合,我不确定是否可以在其上创建可行的索引:

{"_id": "1234", "title": "Document1", "content":"...", "next": "1236"}
{"_id": "1235", "title": "Document2", "content":"...", "next": "1238"}
{"_id": "1236", "title": "Document1a", "content":"...", "prev": "1234"}
{"_id": "1237", "title": "Document2a", "content":"...", "prev": "1235", "next": "1238"}
{"_id": "1238", "title": "Document2b", "content":"...", "prev": "1237", "next": "1239"}
...

由于我需要一个文档的整个“历史”,包括上一个和下一个文档,我想我必须根据列表的大小执行大量查询?

关于如何创建高性能索引的任何建议?存储双链表的不同结构也会很有趣。

4

1 回答 1

9

如果您想优化阅读,您可以使用数组来存储上一个和下一个文档。

{
    "_id": "1237", 
    "title": "Document1", 
    "content":"...", 
    "next": "1238",
    "prev": "1235",
    "parents" : [1000, 1235]
    "children" : [1238, 1239]
}

然后,您可以获取您的 _id 位于子数组或父数组中的所有文档。如果您只需要文档的父级或子级,则此解决方案很好。要获得完整的列表,您不能有效地使用带有 $or 和两个 $in 运算符的索引。

另一种可能更好的解决方案是将每个文档的整个列表(即孩子和父母)存储在一个数组中:

{
    "_id": "1237", 
    "title": "Document1", 
    "content":"...", 
    "next": "1238",
    "prev": "1235",
    "list_ids" : [1000, 1235, 1238, 1239, 1237]
}

这样你就可以建立一个索引list_ids并通过一个简单的 $in 查询来获取所有文档,这将很快。

这两种解决方案的问题是,当您添加新文档时,您需要更新所有相关文档。因此,如果您要编写大量应用程序,这可能不是一个好的解决方案。

于 2013-10-31T09:31:02.363 回答