![](/img/trans.png)
[英]How to update one element of an array according to a condition on another element?
[英]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.