插入mongodb时是否可以定义密钥

时间:2012-05-16 14:28:53

标签: php json codeigniter mongodb

背景:将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无关),但我是一位认可的业余爱好者,已经过深了。

1 个答案:

答案 0 :(得分:3)

$push用于向数组附加值。在您的示例中,measurements是一个数组,Mongo正在追加$newData作为其第一个元素。这解释了0measurements之间的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会自然覆盖给定字段。