MongoDB元素的顺序

时间:2014-07-30 11:49:39

标签: javascript node.js mongodb nosql

我的应用程序有一个游戏列表。每个游戏都有一个位置(以向用户显示的顺序:1,2,3 ......)。

我使用MongoDB来保存所有数据。好的,现在我以4号位的比赛为例。我想将它改为位置1.那么我需要做什么?

我需要在MongoDB中将此游戏的字段位置从4更新为1,并对位于第1位之后的此集合中的所有文档进行增量。

但我认为这不是一个好主意!您可能有想法如何以更好的方式实施它?谢谢!

mongo表的示例:

_id             | name    | description      | position |
________________________________________________________
ObjectId("...") | bubble  | some description | 1
ObjectId("...") | bubbleA | some description | 2
ObjectId("...") | bubbleB | some description | 3
ObjectId("...") | bubbleC | some description | 4
ObjectId("...") | bubbleD | some description | 5
ObjectId("...") | bubbleE | some description | 6
ObjectId("...") | bubbleF | some description | 7

现在,在我的网站中,我按顺序显示游戏:bubble - > bubbleA - > bubbleB - > bubbleC ... 现在我想按顺序在我的网站游戏中显示:bu​​bbleC - > bubbleA - > bubbleB - >气泡... 所以要做到这一点我需要更新"位置"我的表格中的字段为" bubbleC"到" 1",并增加所有其他"位置"对于名称为" bubble"的文档之后的所有文档。但这不是一个好主意。那么如何更好地做到这一点?

1 个答案:

答案 0 :(得分:1)

如果您的文件数量相对较少且不会改变很多位置,那么您的方法并不是那么糟糕。

作为替代方案,您可以将位置元数据存储在单独的数组中。职位更新只会触及一个文件。基本Python示例:

def move(positions, old_index, new_index):
    element = positions.pop(old_index)
    positions.insert(new_index, element)
    return positions

# Fetch array from MongoDB (or from anywhere really)
positions = [
    { '_id': 'ObjectId("...")', 'name': "bubble",  'description': "some description" },
    { '_id': 'ObjectId("...")', 'name': "bubbleA", 'description': "some description" },
    { '_id': 'ObjectId("...")', 'name': "bubbleB", 'description': "some description" },
    { '_id': 'ObjectId("...")', 'name': "bubbleC", 'description': "some description" },
    { '_id': 'ObjectId("...")', 'name': "bubbleD", 'description': "some description" },
    { '_id': 'ObjectId("...")', 'name': "bubbleE", 'description': "some description" },
    { '_id': 'ObjectId("...")', 'name': "bubbleF", 'description': "some description" }
]

old_index = 3
new_index = 0
move(positions, old_index, new_index)

# New positions:
#
# [{'_id': 'ObjectId("...")', 'description': 'some description', 'name': 'bubbleC'},   <--
#  {'_id': 'ObjectId("...")', 'description': 'some description', 'name': 'bubble'},
#  {'_id': 'ObjectId("...")', 'description': 'some description', 'name': 'bubbleA'},
#  {'_id': 'ObjectId("...")', 'description': 'some description', 'name': 'bubbleB'},
#  {'_id': 'ObjectId("...")', 'description': 'some description', 'name': 'bubbleD'},
#  {'_id': 'ObjectId("...")', 'description': 'some description', 'name': 'bubbleE'},
#  {'_id': 'ObjectId("...")', 'description': 'some description', 'name': 'bubbleF'}]

编写一个小帮助函数有助于按_idname移动元素。