3

我正在从 MongoDB 中检索 Lithium 中的DocumentSet,但我不想一次处理所有文档。相反,我想要一个过滤器,我可以这样说:

$manyDocuments->giveMeTheOneWhere(array('foo' => 'bar'));

我已经尝试过这样做,但是没有用:

$manyDocuments->find(function($singleDocument){
    return ($singleDocument->foo == 'bar');
});

即使我在闭包内手动返回 true,它也总是返回一个空的 DocumentSet。

只是为了增加清晰度:我不是在寻找数据库操作,而是想从已经存在的 DocumentSet 中获取一个。有没有一种奇特的方法来实现这一点,还是我需要使用自定义函数遍历集合?

4

3 回答 3

2

这对我来说是正确的。那是您使用的确切代码吗?
例如,您正在使用的“bar”值是您传入的东西吗?

于 2012-04-03T02:04:04.017 回答
1

我在 Lithium 的最新主分支上,并编写了这个对我有用的单元测试。我不确定你为什么得到一个空的 DocumentSet。

$docs = new DocumentSet(array('data' => array(
    new Document(array('data' => array(
        'id' => 1,
        'foo' => 'bar'
    ))),
    new Document(array('data' => array(
        'id' => 2,
        'foo' => 'baz'
    ))),
    new Document(array('data' => array(
        'id' => 3,
        'foo' => 'bar'
    ))),
    new Document(array('data' => array(
        'id' => 4,
        'blah' => 'ack'
    )))
)));
$filtered = $docs->find(function($doc) {
    return $doc->foo === 'bar';
});
$expected = array(
    '0' => array('id' => 1, 'foo' => 'bar'),
    '2' => array('id' => 3, 'foo' => 'bar')
);
$this->assertIdentical($expected, $filtered->data());
于 2012-04-03T22:54:23.130 回答
0

而不是使用find()我只是使用first()了一个闭包。这按预期工作。可悲的是,这是我之前唯一没有尝试过的事情。请原谅我回答我自己的问题。

无论如何,我仍然对获得另一个 Document Set的方法感兴趣。

于 2012-05-01T12:39:10.880 回答