2013-08-18 76 views
0

的項目我有一個文件看起來像這樣:更新數組

{ 
    name: "Name1", 
    values: [ 
    { type: "type1", value: 123 }, 
    { type: "type2", value: 456 }, 
    { type: "type3", value: 666 }, 
    { type: "type3", value: 777 } 
    ] 
} 

有很多。如何更新所有的人,使每個文檔只有一個values.type3比另一個更大:

{ 
    name: "Name1", 
    values: [ 
    { type: "type1", value: 123 }, 
    { type: "type2", value: 456 }, 
    { type: "type3", value: 777 } 
    ] 
} 
+0

值列表是以值字段爲基礎排序的。 – Ishaan

+0

@IshaanKapri,不是。 –

回答

2

如果數據集不是太大,你可以從蒙戈外殼運行以下命令:

db.collection.find({ 'values.type': 'type3' }).forEach(function(doc) { 
    var values = []; 
    var tmp = { value: 0 }; 

    for(var v in doc.values) 
    { 
     v = doc.values[v]; 
     if (v.type !== "type3") 
     values.push(v); 
     else if (v.value > tmp.value) 
     tmp = v; 
    } 

    values.push(tmp); 
    doc.values = values; 

    db.collection.save(doc); 
}); 

只需更改集合名稱,適當的值等等......

+0

爲什麼'find({'values.type':'type3'})'?它必須找到所有的文件。 –

+0

@MariusKavansky - 如果你不想要,你不需要通過任何標準。我的回答只是針對你問題中的例子。如果你不是像在你的例子中那樣擔心'type3',那麼將它改爲尋找所有匹配的鍵並獲得最高值是微不足道的。 – kmfk