如何使用php在mongodb中使用限制内部数组?

时间:2012-10-08 06:36:51

标签: php mongodb mongodb-php

使用php中的limitskip使用mongo文档的内部数组。

$db->users->findOne(array('_id' => new MongoId('5045fa0213cfcdfc06000008')));

上面的查询会给我下面的mongo数组

[_id] => MongoId Object (
    [$id] => 5045fa0213cfcdfc06000008
)
[items] => Array (
    [0] => 13
    [1] => 4
    [2] => 3
    [3] => 7
    [4] => 10
    [5] => 11
    [6] => 28
    [7] => 54
    [8] => 31
    [9] => 33
    [10] => 37
    [11] => 12
)

是否可以将limitskip一起使用上面的mongo doc,如下所示

$db->users->
  findOne(array('_id' => new MongoId('5045fa0213cfcdfc06000008')))->
    limit(5)->skip(5);

将输出为

[_id] => MongoId Object (
    [$id] => 5045fa0213cfcdfc06000008
)
[items] => Array (
    [5] => 11
    [6] => 28
    [7] => 54
    [8] => 31
    [9] => 33
)

如何使用mongo获取items数组的总数?

1 个答案:

答案 0 :(得分:2)

limit()skip()方法仅适用于文档级别,而不适用于数组级别。

您可以使用$slice operator来获取数组的子集:

$skip = 5;
$limit = 5;

$filter = array('_id' => new MongoId('5045fa0213cfcdfc06000008'));
$slice = array('items' => array( '$slice' => array( $skip, $limit ) ));

$db->users->findOne($filter, $slice);

当前(如MongoDB 2.2.0)并不是一种直接的方法来确定数组的大小而不提取它。你可以使用新的Aggregation Framework进行一些操作,但这可能有些过分。

一种常见的使用模式是,当在数组中添加或删除项目时,使用$inc调整同一更新中文档中的计数器。

  

如何使用mongo获取项目数组的总数?

以下是使用mongo shell中的聚合框架的快速示例:

db.users.aggregate(
    { $unwind: '$items' },
    { $group: {
        '_id': '$_id',
        itemcount: { $sum: 1 }
    }}
)