Mongodb用条件更新数组元素顺序

时间:2015-01-30 07:02:20

标签: php arrays json mongodb mongodb-query

我想用条件

对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"  
        },
   ]    
}

2 个答案:

答案 0 :(得分:2)

$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时,请使用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();