簡體   English   中英

Mongod DB使用條件更新數組元素順序

[英]Mongod DB update array element order with condition

我想用條件對Mongodb數組元素進行排序

假設我的數組就像

{
   "id":1,
   "array":[
        {
           "id" : "150",
           "place" : "US"  
        },
        {
           "id" : "1250",
           "place" : "UK"  
        },
        {
           "id" : "1350",
           "place" : "AUS"  
        }
   ]    
}

然后,我想對“數組”進行排序和更新例如:我想按1250,1350,150的順序排列數組元素值“ id”

我更新的文檔看起來像

{
   "id":1,
   "array":[
       {
           "id" : "1250",
           "place" : "UK"  
        },
        {
           "id" : "1350",
           "place" : "AUS"  
        },
        {
           "id" : "150",
           "place" : "US"  
        },
   ]    
}

$ push運算符與$ each$ sort修飾符一起使用。

db.collection.update({"id":1},
                     {$push:{"array":{$each:[],$sort:{"id":1}}}})

數組傳遞給$each修飾符,可確保不添加任何其他元素,並且僅基於id字段以升序的詞法順序對現有元素進行排序(因為id為字符串類型)。

要使用$sort修飾符,它必須與$each修飾符一起出現。 您可以將一個空array []傳遞給$each修飾符,這樣只有$sort修飾符才起作用。

如果要基於id字段上的某些優先級對其進行排序,則可以在應用程序代碼中進行如下處理:

// define an array of elements with decreasing priority
var sortOrder = ["1250","1350","150"];

// find and update all the documents
db.collection.find().forEach(function(doc){
    var arr = doc.array.sort(function(a,b){
        return (sortOrder.indexOf(a.id) - sortOrder.indexOf(b.id));
    })
    db.collection.update({"_id":doc._id},{$set:{"array":arr}});
})

但是,我建議的最佳方法是在插入文檔或更新array字段時保持順序。

具有id字段的映射,以確定元素在數組字段中排序的順序。

var sortOrder = ["1350","1250","150"];

每當您要insert/update ,請使用$ position運算符執行upsert操作,該運算符會根據sortOrder數組在適當位置inserts/updates帶有新元素的數組字段。

var elementToInsert = {"id":"1350","place":"UK"};
db.collection.update({"id":1},
            {$push:{"array":{$each:
                        [elementToInsert],
                      $position:sortOrder.indexOf(elementToInsert.id)}}},
            {"upsert":true})
db.collection.find().sort( { id: 1 } ).pretty();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM