我想用条件
对Mongodb数组元素进行排序假设我的数组就像
{
"id":1,
"array":[
{
"id" : "150",
"place" : "US"
},
{
"id" : "1250",
"place" : "UK"
},
{
"id" : "1350",
"place" : "AUS"
}
]
}
然后我想排序和更新"数组" 例如:我想安排数组元素值" id"按顺序1250,1350,150
我的更新文档将如下所示
{
"id":1,
"array":[
{
"id" : "1250",
"place" : "UK"
},
{
"id" : "1350",
"place" : "AUS"
},
{
"id" : "150",
"place" : "US"
},
]
}
答案 0 :(得分:2)
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
时,请使用upsert运算符执行$position操作,inserts/updates
数组字段的新元素位于适当的位置,基于sortOrder
数组。
var elementToInsert = {"id":"1350","place":"UK"};
db.collection.update({"id":1},
{$push:{"array":{$each:
[elementToInsert],
$position:sortOrder.indexOf(elementToInsert.id)}}},
{"upsert":true})
答案 1 :(得分:0)
db.collection.find().sort( { id: 1 } ).pretty();