我正在使用官方的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)))
答案 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
,因此字段键是不同的。