我是NoSQL
和MongoDB
的新用户,我正在尝试$push
array
进入另一个array
的字段。
我正在尝试将push
$dynamicInfo
添加到我的用户的profile.weightTracker
中,以便我可以new array
将weightTracker
改为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}}
答案 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 )
)
);