mongodb - 在 Lithium 和 MongoDB 中使用嵌套文档/数组

标签 mongodb mongodb-php lithium

我是 MongoDB 和 Lithium 的新手,我真的找不到处理嵌套文档的“好方法”。我注意到当我尝试时

$user = Users::find('first' ... );
$user->somenewfield = array('key' => 'val');

我为“somenewfield”得到的是一个文档对象。但是还有一个 DocumentArray 类——它们之间有什么区别?

当我打电话

$user->save(); 

在 Mongo 中的结果(如预期的那样):

"somenewfield" : { 
 "key": "value" 
}

好的,但是当我稍后想向数组添加一个新的键值并尝试时

$user->somenewfield['newkey'] = 'newval';
var_dump($user->somenewfield->to('array')); // shows the old and the new key-value pairs
$user->save(); // does not work - the new pair is not added

使用锂向文档添加新数组的正确方法是什么?更新数组/向数组添加新值的正确方法是什么?我应该给数组值一个键吗?

提前感谢您的帮助。我有点卡住了......阅读文档,阅读代码......但在某些时候很难单独找出所有内容:)

编辑: 最后我发现我使用嵌套数组的方式是 $push 和 $pull:

Users::update(array('$push' => array('games' => (string) $game->_id)), 
  array(
    '_id' => $this->user()->_id, 
    'games' => array('$ne' => (string) $game->_id)), 
  array('atomic' => false));

最佳答案

我觉得处理子文档有些怪癖,你可以试试:

$somenewfield = $user->somenewfield;
$somenewfield->newkey = newvalue;
$user->somenewfield = $somenewfield;
$user->save();

或者替代语法:

$user->{'somenewfield.newkey'} = $newvalue;
$user->save();

您应该能够在测试中找到更多示例(在文档的任何测试中查看测试/数据)。

关于mongodb - 在 Lithium 和 MongoDB 中使用嵌套文档/数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11569208/

相关文章:

javascript - 如何在一次查询中使用 .skip()、.limit() 和总匹配结果进行 MongoDB 文本搜索?

mongodb - 如何在已排序的 MongoDB 集合中找到一行的行号以计算其百分位数?

PHP - Lithium框架如何更改/切换默认布局

php - 如何在 Lithium PHP 框架的查询中使用 SUM 聚合函数

mongodb - 使用 mgo 或 bson 在 Go 中重命名 mongo 集合?

php - 是否有用于 codeigniter 的 mongodb 支持的用户身份验证库?

mongodb - 使用 MongoDB 进行正确的索引和排序

mongodb - PHP MongoDB 使用跳过和限制命令不同

sql - 左连接的锂计数

node.js - 按页面大小 10 获取所有文章,每篇文章填充一些所需的用户信息