我有一个包含有序项目嵌套数组的文档,我需要对该数组中的项目进行原子重新排序。
这是将在服务器端执行的代码:
var reorder = function (
catalog_id,
parent_id,
item_id,
new_pos) {
var old_pos;
var collection = db.catalogs;
var catalog = collection.findOne({catalog_id:catalog_id});
var result = [];
for(i in catalog.list) {
var item = catalog.list[i];
if(item.id == item_id) {
old_pos = item.order;
result.push({old_pos:old_pos});
break;
}
}
if(old_pos == new_pos)
return result;
var up = new_pos < old_pos;
catalog.list.forEach(function(item){
if( item.parent == parent_id &&
(up ?
(item.order <= old_pos && item.order >= new_pos) :
(item.order <= old_pos && item.order >= new_pos))){
if(item.id != item_id) {
item.order++;
result.push({down:item});
}
else {
item.order = new_pos;
result.push({up:item});
}
collection.update(
{catalog_id:catalog_id, 'list.id':item.id},
{$set:{'list.$.order':item.order}});
}
});
return result;
};
reorder('diagnostic_graph', 'n1', 'n5', 1);
这是一个示例数据:
{
"_id" : ObjectId("4efc939094f4a115d80c8543"),
"catalog_id" : "diagnostic_graph",
"list" : [{
"id" : "n1",
"order" : 0
}, {
"id" : "n2",
"parent" : "n1",
"order" : 0
}, {
"id" : "n3",
"parent" : "n1",
"order" : 1
}, {
"id" : "n4",
"parent" : "n1",
"order" : 2
}, {
"id" : "n5",
"parent" : "n1",
"order" : 3
}]
}
PS。抱歉,如果事情不清楚 - 英语不是我最好的技能
答案 0 :(得分:0)
问1.服务器端代码是否适合执行此任务?
A 1.这取决于。如果数组需要在每次使用时重新排序,那么每当您向数组添加项目时都应重新排序。无论何时将项目推送到数组,都可以调用服务器端.js代码,或者在应用程序中执行此操作。
问2.服务器端代码是否是此任务的唯一解决方案?
A 2.正如我在第一个问题的答案中所述,这不是唯一的解决方案。
问3.在女巫范围内,此代码将阻止:
A 3.答案是单一文件(AFAIK)。