2014-08-30 102 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