JS mongoDB按previousItem属性排序(父子关系)

时间:2016-01-12 14:18:36

标签: javascript mongodb sorting

我有一个项目集合,其中的文档具有重要的顺序,并且可能会发生变化(即创建时间或ID不能用于排序)。

我认为添加previous / nextItem属性可能是一个解决方案

{
  id: 1,
  name: "itemC",
  previousItem : 2,
  nextItem : 0
}

{
  id: 0
  name: "itemB", 
  previousItem : 1,
  nextItem : null
}

{
  id: 2,
  name: "itemA",
  previousItem : null,
  nextItem : 1
}

我想根据遍历previousItem属性的sort参数检索记录。

以上收藏品应返回:

{
  id: 2,
  name: "itemA",
  previousItem : null,
  nextItem : 1
}

{
  id: 1,
  name: "itemC",
  previousItem : 2,
  nextItem : 0
}

{
  id: 0
  name: "itemB", 
  previousItem : 1,
  nextItem : null
}

2 个答案:

答案 0 :(得分:1)

以下是排序索引的基本假设: 索引属性是一个字符串,以允许超过17位数。 2.仅使用相邻项的最后一位数来计算新索引,以避免计算超过17位数。算法(以下值都是字符串):

indices:
I1
I2
I3

add item between 1 and 2 --> 
   is there an integer between the two values?
   yes --> use it as the new index
   no --> use the lower index and append 05, add 00 to lower index

eval (1,2) --> no

I100
I105
I2
I3

add an item between 100 and 105
eval(100,105) --> yes

I100
I102
I105
I2
I3

add an item between 100 and 102
eval(100,102) --> yes

I100
I101
I102
I105
I2
I3

add an item between 100 and 101
eval(100,101) --> no

I100
I1005
I101
I102
I105
I2
I3

and so on.

输出 db.getCollection(' items')。find({})。sort({index:1})

产生预期结果。

答案 1 :(得分:0)

是否会在您的记录集中添加索引,然后在查询时可以获得按该索引排序的结果集在您的情况下不起作用?

https://docs.mongodb.org/v3.0/tutorial/sort-results-with-indexes/

编辑更新:

您可以使用索引的细分,例如:

在indexA = 2和indexB = 3的元素之间插入,生成insertIndex =(2 + 3)/ 2 = 2.5

但是,在Javascript中,您需要使用最多17个小数的浮点数,与MongoDB double相同。您需要考虑到这一点,如果舍入发生,例如,如果insertIndex = indexA或= indexB,那么您点击限制并需要调用函数来更新数据库并循环所有元素以使用例如整数更新其索引。在第一次这样做之后,它可能不会经常触发并且随着时间的推移会越来越少。