0
我在MongoDB中的用戶集合下有一個類別數組。Node,MongoDB:使用範圍查詢增加數組中項目的值
基本上前端有一個拖放菜單類,當發生拖動時我想更新數據庫。由於無法在數組中移動項目,因此我決定在mongodb中給它們一個位置值「pos」,並稍後以angularjs對它們進行排序。
categories: [
{
"_id" : ObjectId("5776782a57c9580256536656"),
"title" : "Cars",
"url" : "cars",
"pos" : 0
},
{
"_id" : ObjectId("5776786afdcd6ed056edff25"),
"title" : "Photography",
"url" : "photography",
"nodes" : [
{
"_id" : ObjectId("57767870fdcd6ed056edff26"),
"title" : "Landscape",
"url" : "landscape"
}
],
"pos" : 1
},
{
"_id" : ObjectId("adf9845782578a376161d079"),
"title" : "Travel",
"url" : "travel",
"pos" : 2
}
]
我使用的NodeJS-Express作爲服務器,這裏是我的代碼移動類別。
- oldIndex:移動
- 用戶id之後類別的新位置:移動
- newIndex之前類別的位置的用戶對象ID
if (newIndex>oldIndex){
db.collection('users').updateOne({ "_id": userId, "categories.pos": { $gte: oldIndex, $lt: newIndex } }, { $inc : { "categories.$.pos" : -1 } }, function (err, res) {
console.log(res);
if (err) callback(0)
else {
db.collection('users').updateOne(filter, { $set : cdata }, function (err, res) {
if (err) callback(0);
callback(1);
});
}
});
} else {
db.collection('users').updateOne({ "_id": userId, "categories.pos": { $gt: newIndex, $lte: oldIndex } }, { $inc : { "categories.$.pos" : 1 } }, function (err, res) {
console.log(res);
if (err) callback(0)
else {
db.collection('users').updateOne(filter, { $set : cdata }, function (err, res) {
if (err) callback(0);
callback(1);
});
}
});
}
基本上,代碼旨在做到這一點
如果(newIndex> oldIndex)
- A類 - 0(oldIndex)
- B類 - 1
- C類 - 2
- 類別d - 3
將A移至索引2
- B組 - 0(-1)
- C類 - 1(-1)
- A類 - 2(newIndex)
- 類別d - 3(0)
和圍繞
如果(oldIndex> newIndex)
- CATEG其他方式ORY A - 0
- B類 - 1
- C類 - 2(oldIndex)
- 類別d - 3
移動℃至索引0
- C類 - 0 (newIndex)
- 類別A - 1(+1)
- 類別B - 2(+1)
- 類別d - 3(0)
在這種情況下,我不能運行查找查詢看到&排查查詢的結果..
與任意數量的類別,僅查詢更新一個值。
我想我需要一雙新的眼睛。
謝謝。
感謝您的回答,感謝 如果某個分類有很多子分類,那麼對於性能我覺得不好。現在我從客戶端發送類別的ID和舊/新索引,所以請求很短, 這樣我就必須從客戶端發送所有移動的項目的json,或者進行查找查詢以獲取通過id第一類。昨天爲了縮短我做它從客戶端到服務器發送整個類別的json以進行更新,您的解決方案現在是更好的替代方法。 –
如果您認爲解決了您的問題,請接受解決問題的答案。 – NotBad4U