2016-08-01 50 views
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)

在這種情況下,我不能運行查找查詢看到&排查查詢的結果..

與任意數量的類別,僅查詢更新一個值。

我想我需要一雙新的眼睛。

謝謝。

回答

0

MongoDB保持數組的順序。 那麼,關於刪除數組中的元素,並通過使用$position

查詢重新插入與正確的位置的元素進行刪除元素:

db.getCollection('users').update({ 
     "_id" : idusers 
    }, 
    { 
     $pull: { 
      categories: { 
       field: foo //your field for grep the element 
      } 
     } 
}) 

而對於定爲他的新指數的元素查詢:

db.getCollection('users').update(
    { 
     "_id" : idusers 
    }, 
    { 
     $push: { 
      categories: { 
       // Set just one element in the $each, that enable you to use $position 
       $each: [{ 
        "title" : "Photography", 
        "url" : "photography", 
        "nodes" : [{ 
          "_id" : ObjectId("57767870fdcd6ed056edff26"), 
          "title" : "Landscape", 
          "url" : "landscape" 
        }] 
       }], 
       $position: newIndex 
      } 
     } 
    } 
) 

我做了一些手工測試,並且似乎工作

+0

感謝您的回答,感謝 如果某個分類有很多子分類,那麼對於性能我覺得不好。現在我從客戶端發送類別的ID和舊/新索引,所以請求很短, 這樣我就必須從客戶端發送所有移動的項目的json,或者進行查找查詢以獲取通過id第一類。昨天爲了縮短我做它從客戶端到服務器發送整個類別的json以進行更新,您的解決方案現在是更好的替代方法。 –

+0

如果您認爲解決了您的問題,請接受解決問題的答案。 – NotBad4U