【发布时间】:2014-03-15 01:20:53
【问题描述】:
我正在寻找一种实现排序键的好方法,这是完全由用户定义的。例如。用户会看到一个列表,并且可以通过拖动元素来对元素进行排序。应该保持这个顺序。
一种常用的方法是在每个元素内只创建一个升序整数类型的排序字段:
{
"_id": "xxx1",
"sort": 2
},
{
"_id": "xxx2",
"sort": 3
},
{
"_id": "xxx3",
"sort": 1
}
虽然这肯定会起作用,但它可能并不理想:如果用户将元素从最底部移动到最顶部,则需要更新其间的所有索引。我们这里不是在讨论嵌入式文档,所以这会导致很多单独的文档被更新。这可以通过创建中间有间隙的初始排序值(例如 100、200、300、400)来优化。但是,如果两个元素之间的空间用完,这将需要额外的逻辑和重新排序。
想到另一种方法:让父文档包含一个排序数组,它定义了子文档的顺序。
{
"_id": "parent01",
"children": ["xxx3","xxx1","xxx2"]
}
这种方法肯定会使更改顺序更容易,但也有它自己的警告:父文档必须始终跟踪其子文档的有效列表。由于添加子项将更新多个文档,因此这可能仍然不理想。并且需要对从客户端接收到的输入进行复杂的验证,因为此列表的长度和包含的元素可能永远不会被客户端更改。
有没有更好的方法来实现这样的用例?
【问题讨论】:
-
第二个选项在我看来更加有效和可行。对从客户端接收到的输入进行复杂验证是什么意思?如果您只想检查客户端是否使用有效元素,您可以使用第二个单独的集合,其中仅包含有效元素来检查这一点。此外,mongodb 将很快就会在生产版本中添加“在索引处插入”选项 (jira.mongodb.org/browse/SERVER-2363)。
-
谢谢,这个问题只会出现在允许客户端发送更新列表的情况下,而不是客户端发送必要步骤来重新创建更新列表的情况下。但是,您可能应该提交该评论作为答案。