将LINQ查询转换为php mongodb查询格式

时间:2012-07-22 13:52:30

标签: php linq mongodb

我正在使用官方的C#mongodb驱动程序,它确实有LINQ支持。但我在尝试将其转换为使用php驱动程序时遇到了麻烦。

这是LINQ查询:

.Where(c => DateTime.UtcNow.Subtract(c.DateRequested).TotalDays <= 14).Where(d => ((d.itemid == req.itemid) && (d.MediaType == req.MediaType)) && (d.Status != RequestStatus.Cancelled))

我不是百分百确定如果我正确地解决这个问题,但这是我迄今为止以可读格式进行的尝试:

Array
(
   [$and] => Array
       (
           [DateRequested] => Array
               (
                   [$gt] => MongoDate Object
                       (
                           [sec] => 1341754027
                           [usec] => 0
                       )

                   [$lte] => MongoDate Object
                       (
                           [sec] => 1342963627
                           [usec] => 0
                       )

               )

           [$and] => Array
               (
                   [$and] => Array
                       (
                           [itemid] => 76510
                           [MediaType] => 0
                       )

                   [Account] => Josh
               )

           [Status] => Array
               (
                   [$ne] => 3
               )

       )

)

这是凌乱的形式:

array('$and' => array('DateRequested' => array('$gt' => new MongoDate((time() - 1209600)), '$lte' =>new MongoDate(time())),'$and' => array('$and' => array('itemid' => $itemid,'MediaType' => $source),'Account' => $account),'Status' => array('$ne' => 3)))

1 个答案:

答案 0 :(得分:2)

不确定我是否从上面的代码示例中推断出了正确的文档结构,但假设在mongo shell中添加了类似于以下内容的测试文档:

// Insert test data
db.mycoll.insert({
    'DateRequested': new Date(),
    'itemid': 76510,
    'MediaType': 0,
    'Account': 'Josh',
    'Status': 2
});

PHP中的示例搜索可能如下所示:

<?php
    $DAYS14 = 14 * 24 * 60 * 60; // Seconds in 14 days
    $CANCELLED = 3; // Status

    // Dummy search data
    $data['itemid']    = 76510;
    $data['mediatype'] = 0;
    $data['account']   = 'Josh';

    $query = array(
        '$and' => array(
            array('DateRequested' => array('$lt' => new MongoDate(time()))),
            array('DateRequested' => array('$gte' => new MongoDate(time() - $DAYS14))),
        ),
        'itemid'    => $data['itemid'],
        'MediaType' => $data['mediatype'],
        'Account'   => $data['account'],
        'Status'    => array('$ne' => $CANCELLED),
    );

    $document = $collection->findOne($query);

    // Peek at the result
    print_r($document);
?>

请注意,查询元素隐式使用“和”条件。如果需要重复相同的字段(例如DateRequested),则需要显式$and,因此字段键是不同的。