假设我有这份文件,我想更新:
array(
'_id' => 123,
'entries' => array(
'4d8aae834f42e06b638d0000' => array(
'user_id' => 2,
'ts' => 'Wed, 23 Mar 2011 19: 37: 55 -0700'
)
)
)
我有一个数组,我想将其附加到条目字段中:
$entries = array(
'4d8aae834f42e06b638d0000' => array('user_id' => 3, 'ts' => 'Wed, 21 Mar 2011 19: 37: 55 -0700')
'4d8aae834f42e06b638d3219' => array('user_id' => 4, 'ts' => 'Wed, 22 Mar 2011 19: 37: 55 -0700')
);
尝试过的查询:
$updateData = array(
'$pushAll' => array(
'entries' => $entries
)
);
$db->update('journal', array('_id' => 123), $updateData, array('upsert' => true));
上述查询不会附加新数据。将修改器从$ pushAll更改为$ set显然不起作用,因为它只是替换已经存在的内容。我已经尝试了$ addToSet,它也没有用。我现在都没有选择了。
这就是我希望文档最终结束的方式:
array(
'_id' => 123,
'entries' => array(
'4d8aae834f42e06b638d0000' => array(
'user_id' => 2,
'ts' => 'Wed, 23 Mar 2011 19: 37: 55 -0700'
),
'4d8aae834f42e06b638d0000' => array(
'user_id' => 3,
'ts' => 'Wed, 21 Mar 2011 19: 37: 55 -0700'
),
'4d8aae834f42e06b638d3219' => array(
'user_id' => 4,
'ts' => 'Wed, 20 Mar 2011 19: 37: 55 -0700'
)
)
)
提前致谢。
答案 0 :(得分:4)
经过更多测试;如果有人有兴趣,我已设法找到一个可行的解决方案。
使用前缀'entries'(或您要更新的任何字段名称)设置新数据中的键,并使用修饰符'$ set'来完成这一操作。
$entries = array(
'entries.4d8aae834f42e06b638d0000' => array('user_id' => 3, 'ts' => 'Wed, 21 Mar 2011 19: 37: 55 -0700')
'entries.4d8aae834f42e06b638d3219' => array('user_id' => 4, 'ts' => 'Wed, 22 Mar 2011 19: 37: 55 -0700')
);
更新:
$updateData = array(
'$set' => $entries
);
$db->update('journal', array('_id' => 123), $updateData, array('upsert' => true));
答案 1 :(得分:1)
我想我会给你一些关于你工作解决方案的信息。根据我的经验,您不能“$ push”或“$ addToSet”的原因是因为您的目标“条目”可能是嵌入对象。你只能在嵌入式数组上使用$ push,$ pushAll,$ addToSet,这就是为什么你必须使用点符号来更新你想要的...
不幸的是,对于我们php开发人员来说,游标查询总是将数据作为数组返回,检查“条目”之类的东西是否是数组或对象的最佳方法是在mongo shell中运行find()并查看对于结果中的花括号/方括号(“{}”或“[]”)。