3
我有一個嵌套有序項目數組的文檔,我需要自動重新排列數組中的項目。原子序列MongoDB文檔嵌套數組中的項目
- 服務器端代碼是否適合此任務?
- 服務器端代碼是這個任務的唯一解決方案嗎?
- 在巫範圍這個代碼將阻塞:
- 單個文檔
- 單個集合
- 整個服務器?
這是將在服務器側執行的代碼:
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。對不起,如果有什麼不清楚 - 英語不是我最好的技能
我不確定這個操作是否會自動運行。據我所知,它會產生鎖定。 – 2011-12-30 13:32:38
但是,您可以在客戶端計算所有這些信息,然後原子重寫文檔。 – 2011-12-30 13:37:48
我想MongoDB傢伙們建議使用[Update if Current Update](http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22UpdateifCurrent%22)方法(類似於CAS(「change-and-set 「)在memcached中)的原子文檔更改無法用」更新修飾符「表示。 – 2011-12-30 13:55:08