使用cakephp2.3和mongoDB,如何在文档中添加数组?

使用cakephp2.3和mongoDB,如何在文档中添加数组?,mongodb,cakephp-2.3,Mongodb,Cakephp 2.3,如何处理mongoDB中的列表 例如,我有一个文档(类)和该类学生的列表,即子文档(学生)。 你所不知道的,是给一个班增加更多的学生 在模型中: public function salvar($name,$idClass){ $new = array( "_id" => $idClass, "student"=> array( 'idStudent' => new MongoId(),

如何处理mongoDB中的列表

例如,我有一个文档(类)和该类学生的列表,即子文档(学生)。 你所不知道的,是给一个班增加更多的学生

在模型中:

public function salvar($name,$idClass){

 $new = array(     
   "_id" => $idClass,
   "student"=>  array(
                        'idStudent' => new MongoId(),
                        'name' => $name));

  return $this->save($new);
    }

但是当你添加一个新学生时,他不是这样工作的。

问题的答案是:

public function salvar($name,$size,$id){

    $this->mongoNoSetOperator = '$push';

    // fixed array data structure
    $susp = array( 
        "_id" => $id,
        "images"=> array(
            array(
                'id' => new MongoId(),
                'name' => $name,
                'size' => $size
            )
        )
     );

    return $this->save($susp);
}
注意:通过清晰客观的回答感谢github的Garamon。

如何执行$push更新 你提供的答案阐明了你一直在努力做什么。然而,解决方案有点复杂。要使用MongoDB执行
$push
更新,只需指定要执行推送更新:

$this->Foo->save(array( 
    '_id' => $id,
    '$push' => array(
        "images" => array(
            'id' => new MongoId(),
            'name' => $name,
            'size' => $size
        )
     )
);
您可以使用
mongoNoSetOperator
属性实现相同的功能,但是

  • 这是间接的,因此不明显
  • 对于在同一请求中保存的多个调用,如果未将其重置为
    $set
    ,则可能会造成混淆
  • 它防止在一次调用中使用多个运算符
  • 有关在中使用不同更新运算符的详细信息