尝试$推入集合不会推送多个项目

时间:2013-07-30 08:03:18

标签: php arrays mongodb nosql

我是NoSQLMongoDB的新用户,我正在尝试$push array进入另一个array的字段。

我正在尝试将push $dynamicInfo添加到我的用户的profile.weightTracker中,以便我可以new arrayweightTracker改为push当前代码推送替换但不是每次刷新页面/运行脚本时,array new array$dynamicInfo['currentWeight'] = '83'; $user = $this->db()->users; // Deals with the static info that just need an update if ( empty( $staticInfo ) == false ) { $user->update( array('_id' => new MongoId( $userId ) ), array('$set' => array('profile' => $staticInfo) ), array('upsert' => True) ); } // Deals with the dynamic info that needs to be inserted as array if ( empty( $dynamicInfo ) == false ) { //$dynamicInfo['inserted_on'] = new MongoDate(); $user->update( array('_id' => new MongoId( $userId ) ), array('$push' => array('profile.weightTracker' => $dynamicInfo ) ), array('safe' => True) ); } ,而是重写当前。

有人能指出我做错了什么吗?

提前致谢。

{{1}}

enter image description here

1 个答案:

答案 0 :(得分:2)

我希望每次运行时处理静态信息的代码都会写入文档,然后再次处理动态信息的代码只是第一个数组元素。换句话说,我认为$staticInfo在你预期的时候是空的。

如果你这样做:

$user->update(
    array( '_id' => 42 ),
    array( '$set' => array( 'profile.weightTracker' => array( 'height' => 82 ) ) )
);

然后:

$user->update(
    array( '_id' => 42 ),
    array( '$set' => array( 'profile' => array( 'height' => 176 ) ) )
);

然后整个数组profile将设置为array( 'height' => 176 )。如果您之前已将'profile.weightTracker'设置为其他值,则无关紧要。

您无法设置数组(profile)并期望在第一次更新(profiler.weightTracker)中未指定的子键生存。

但是,您可以做的是 - 只需构建$set数组并一次运行更新:

$user->update(
    array( '_id' => 42 ),
    array(
        '$push' => array( 'profile.weightTracker' => array( 'currentWeight' => 82 ) ),
        '$set' => array( 'profile.height' => 176 )
    )
);