2016-03-05 59 views
2

我需要能夠遞增和遞減MongoDB對象中的數組元素的位置。如何使用MongoDB更改數組的順序?

我看着MongoDB API中的<update> API,但找不到任何東西讓我這樣做。

我正在嘗試使用findOneAndUpdateMongoose,我知道我試圖向上或向下移動的元素的索引。

base64編碼圖像數組項的一個例子:我想移動,例如「IMG2」,向上或向下

{ 
    images: [ 
    "img1", 
    "img2", 
    "img3" 
    ] 
} 

和(但「圖像」不應該能夠向上推因爲無處可去)。

如果我想推「IMG2」了,那麼結果將是:

{ 
    images: [ 
    "img2", 
    "img1", 
    "img3" 
    ] 
} 

如果我通過改變指數,交換,或推升/降達到這個不要緊。

+1

對不起,但您的問題很不清楚,並且有許多不同的解釋方式。您應該更新示例文檔和您想要實現的結果。 –

+0

感謝您的反饋,我更新了我的問題。請讓我知道,如果我可以進一步澄清。 –

+1

寫一個「抽象案例」的問題是,適合這種情況的答案几乎**從不**適用於您試圖表示並最終解決的真實世界場景。我會展示你的真實數據,或至少與真實代表的數據接近。你的'base64'圖像不太可能像'[「img1」,「img2」,「img3」'這樣簡單的內容,當然也是複雜的編碼字符串。所以人們很重要的是知道這是否只是簡單的「base64 「數據直接在每個數組索引中,或者它是否駐留在另一個文檔中,並帶有一些標識符或者關鍵字 –

回答

3

像@布雷克七說,你有兩種方式來做到這一點:

掠,更新和推動

db.images.find({ _id: '' }, { images : 1 }) 
.then(function(img) { 
    var tmpImg = img.images[0]; 
    img.images[0] = img.images[1]; 
    img.images[1] = tmpImg; 

    db.images.update({ _id: img._id }, { $set: { images: img.images } }); 
}) 

直接更新(如果您在客戶端上的圖像並知道指數),使用$位置

db.images.update({ _id: '' }, { $push: { images: { $each: ['img2'] }, $position: 0 } } }) 
.then(function() { 
    db.images.update({ _id: '' }, {$unset: {'images.2': 1}}) 
}); 

https://docs.mongodb.org/manual/reference/operator/update/position/

不過,我想你應該重新設計你保存你的圖像的方式,利用例如虛擬排序:

{ 
    images: [ 
    { base64: 'img1', order: 0, _id: 'img1' }, 
    { base64: 'img2', order: 1, _id: 'img2' }, 
    { base64: 'img3', order: 2, _id: 'img3' } 
    ] 
} 

通過這種方式,你可以使用虛擬訂單指數訂購您的圖像,其更新只使用_id,或者通過更改所有img2的順序來更新整個集合,刪除或替換圖像等。

+0

我曾想過如何將您的方法添加到數據庫對象的索引中,但是之後我不需要更新其他圖像順序索引,所以它在很大程度上是相同的事情? –

+1

是的,你將不得不更新現有的文件,第一次有一個統一的數據庫,其餘的我不知道你的實施和你如何使用圖像,所以這是你的電話它只是一個建議:D –

+0

我的意思是即使在第一次之後,如果我想更改單個項目的順序,我仍然需要修改其他訂單ID。我沒有看到這種情況會如何讓我受益,因爲我正在修改整個對象。有沒有簡單的方法來修改我缺少的所有訂單ID? –