如何在MongoDB中创建(双)链表结构?

ale*_*loy 5 mongodb

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

{"_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"}
...
Run Code Online (Sandbox Code Playgroud)

由于我需要包含prev和next文档的文档的整个"历史记录",我想我必须根据列表的大小执行大量查询?

有关如何创建高性能索引的任何建议?用于存储双链表的不同结构也将是有趣的.

Chr*_*n P 7

如果要优化读取,可以使用数组存储上一个和下一个文档.

{
    "_id": "1237", 
    "title": "Document1", 
    "content":"...", 
    "next": "1238",
    "prev": "1235",
    "parents" : [1000, 1235]
    "children" : [1238, 1239]
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以获取_id在子数组或父数组中的所有文档.如果您只需要文档的父母或子女,此解决方案就很好.要获得整个列表,您无法有效地使用带有$或两个$ in运算符的索引.

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

{
    "_id": "1237", 
    "title": "Document1", 
    "content":"...", 
    "next": "1238",
    "prev": "1235",
    "list_ids" : [1000, 1235, 1238, 1239, 1237]
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以list_ids使用简单的$ in查询来获取索引并获取所有文档.

这两种解决方案的问题在于,您需要在添加新文档时更新所有相关文档.因此,如果你想要一个写重的应用程序,这可能不是一个好的解决方案.

  • 谢谢基督徒.你的回答把我推向了一个不同的方向:我想我会保存一堆文件而没有关于他们兄弟姐妹的任何信息,只是维护一份包含所有相关文件顺序的清单. (2认同)