Php 在MongoDB中添加findOne字段

Php 在MongoDB中添加findOne字段,php,mongodb,Php,Mongodb,我需要在findOne操作中添加一个字段,该字段将包含文档内部数组的大小 例如: 我想在findOne操作之后获得一个新的字段名“numfchildren”:3。 这可能吗 更新: 我不能像@chridam建议的那样做,因为我需要对数组进行切片 整个查询: $children = $this->_childrenCollection->findOne( array('_id' => new MongoId($id)),

我需要在findOne操作中添加一个字段,该字段将包含文档内部数组的大小 例如:

我想在findOne操作之后获得一个新的字段名“numfchildren”:3。 这可能吗

更新: 我不能像@chridam建议的那样做,因为我需要对数组进行切片 整个查询:

$children = $this->_childrenCollection->findOne(
                    array('_id' => new MongoId($id)),
                    array('children' => array('$slice' => 100))
                );

最好的方法是使用,特别是管道操作符,它使用操作符计算数组的大小,将结果投影到新字段

要获得类似于
findOne()
方法的单个结果,请将方法用于从方法返回的光标:

var pipeline = [
    {
        "$project" : {          
            "children": 1,
            "numOfChildren": {
                "$size": "$children"
            }
       }
    }
];

var resultArray = db.collection.aggregate(pipeline).toArray();

if (resultArray.length > 0) { printjson (resultArray[0]); }
PHP示例实现:

<?php
$m = new MongoClient("localhost");
$c = $m->selectDB("test")->selectCollection("collectionName");
$ops = array(
    array(
        '$project' => array(
            "children" => 1,
            "numOfChildren"   => array(             
                "$size" => "$children"
            )
        )
    )
);
$results = $c->aggregate($ops);
var_dump($results);
?>


是的,谢谢。为此,我确实使用了聚合框架,但我并不总是需要(至少我这么认为),因此为了保存聚合操作,我尝试使用单个findOne操作。返回时我没有完整的数组大小,因为我正在生成数组('children'=>array('$slice'=>100)),因为我只需要前100个。我已经更新了整个queryDo你想得到元素的完整数量(不是$sliced)吗?或者查询返回的元素数?举个例子,如果你有200个元素,你希望在你的新领域里得到什么?200还是100?@ConstantinGuay是的,我想得到200-数组成员的总数。好的,那么我可以问一下,为什么你在数组中使用$slice?你害怕有太多的结果吗?@ConstantinGuay是的,我可以有数千个数组,所以我想切片。但仍然可以在一个简单的Mongo查询中获得原始数组大小。
<?php
$m = new MongoClient("localhost");
$c = $m->selectDB("test")->selectCollection("collectionName");
$ops = array(
    array(
        '$project' => array(
            "children" => 1,
            "numOfChildren"   => array(             
                "$size" => "$children"
            )
        )
    )
);
$results = $c->aggregate($ops);
var_dump($results);
?>