背景:将CodeIgniter与this MongoDB library一起使用。
这是我与mongodb的第一次回合,到目前为止我很享受。我需要一段时间才能将自己与sql的思维方式区分开来,但它非常适合我当前的项目。
我正在尝试使用...
将数组推送到文档中$this->mongo_db->where(array('_id'=>$estimate_id))->push("measurements", $newData)->update('estimates');
如果我使用json_encode($newData)
编码$ newData,我会得到{"levels":[{"level_qty":12,"level_uom":"ft"}]}
问题是,当我的函数在mongodb文档中创建measurements
行时,它会自动启动一个插入[0]的数组。像这样......
"measurements" : [ { "levels" : [ { "level_qty" : 12, "level_uom" : "ft" } ] }]
......留下我......
-measurements
--0
----levels
-----0
------level_qty => 2,
------level_uom => ft
我真正想要的是......
-measurements
--levels
---0
----level_qty => 2,
----level_uom => ft
我确定我错过了一些相当基本的东西(即与php相关而且与mongodb无关),但我是一位认可的业余爱好者,已经过深了。
答案 0 :(得分:3)
$push用于向数组附加值。在您的示例中,measurements
是一个数组,Mongo正在追加$newData
作为其第一个元素。这解释了0
和measurements
之间的levels
索引。在您想要的结果中,measurements
是一个等同于$newData
的对象(即它具有levels
属性,而该属性又包含一个对象数组。
以下任何一个示例都应该达到您想要的效果:
// if $newData is {"levels": [{"level_qty":12,"level_uom":"ft"}]}
->set("measurements", $newData)
// if $newData is [{"level_qty":12,"level_uom":"ft"}]
->set("measurements.levels", $newData)
// if $newData is {"level_qty":12,"level_uom":"ft"}
->push("measurements.levels", $newData)
注意:$push
如果要在未来更新时附加数据会更灵活,而$set
会自然覆盖给定字段。