2014-08-30 33 views
0

數組原文:MongoDB的查詢服務:更新對象轉換成數組,在對象

_id: "54022f8b705ebb4010170f02", 
exercises: [ 
{ 
    name: "Bench" 
}, 
date: "2014-08-30T20:31:22.982Z" 

期望的更新:

_id: "54022f8b705ebb4010170f02", 
exercises: [ 
{ 
    name: "Bench", 
    sets: [{weight: 275, reps: 5}] 
}, 
date: "2014-08-30T20:31:22.982Z" 

我已經沿着此線嘗試的東西(不工作),但我有麻煩了一套進入正確的位置:

db.workouts.update(
     { _id: ObjectId('54022f8b705ebb4010170f02'), "exercises.name":'Bench'}, 
     { 
      $push: 
      { 
       sets: 
       { 
        weight: 275, 
        reps: 5, 
       } 
      } 
     } 
    ) 

此外,高高興興地走建議,如果有一個更好的方法來模擬這個。

回答

1

推送操作在這裏應該沒問題,但您需要做的是確定要將對象推送到的陣列位置。通過在查詢部分查找「Bench」完成了一半更新。現在,你需要確定與positional $運營商也認識到「集」是一個元素下的「演習」,所以它需要被譜寫這樣:

db.workouts.update(
    { 
     "_id": ObjectId("54022f8b705ebb4010170f02"), 
     "exercises.name":"Bench" 
    }, 
    { 
     "$push": { 
      "exercises.$.sets": { 
       "weight": 275, 
       "reps": 5 
      } 
     } 
    } 
) 

這樣說,使用$push添加新的「設置「項目或額外的」集合「項目不是問題,所以如果你的模型基本上是」僅追加「,那麼這很好。如果您打算在未知的某個位置「更新」該內部數組元素,唯一的問題是。例如,將「weight」275改爲6「reps」。

發生這個問題是因爲positional $運算符只用於捕獲數組的「第一個」匹配位置,並且它始終是「外部」數組或「運算」。所以,你不能做到這一點:

db.workouts.update(
    { 
     "_id": ObjectId("54022f8b705ebb4010170f02"), 
     "exercises.sets.weight": 275 
    }, 
    { 
     "$set": { 
      "exercises.$.sets.$.weight": 285 
     } 
    } 
) 

但對於一個已知的位置,你可以:

db.workouts.update(
    { 
     "_id": ObjectId("54022f8b705ebb4010170f02"), 
     "exercises.sets.weight": 275 
    }, 
    { 
     "$set": { 
      "exercises.$.sets.0.weight": 285 
     } 
    } 
) 

但「第一」陣列位置始終是返回,而不是從內部數組的索引。

那就是要了解你的造型採用嵌套數組時考慮的最主要的事情。

+0

令人驚歎。我喜歡MongoDB。 – kayla 2014-08-30 23:27:42