【问题标题】:Is it possible to define the key when inserting into mongodb插入mongodb时是否可以定义键
【发布时间】:2012-05-17 02:01:35
【问题描述】:

背景:使用 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 相关),但我是公认的业余爱好者,涉水太深。

【问题讨论】:

    标签: php json codeigniter mongodb


    【解决方案1】:

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

    【讨论】:

    • 谢谢,jmikola。感谢您的帮助 - 对 push 和 set 之间的区别进行了很好的解释。
    猜你喜欢
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 2014-02-23
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多