У меня есть база данных mongodb, которая содержит две связанные коллекции.Как найти запись коллекции mongodb ObjectId в php
Первый из них имеет набор данных, который выглядит следующим образом:
{
"_id": ObjectId("5326d2a61db62d7d2f8c13c0"),
"reporttype": "visits",
"country": "AT",
"channel": "wifi",
"_level": NumberInt(3)
}
ObjectId связан с несколькими наборами данных во второй коллекции, которые выглядят следующим образом:
{
"_id": ObjectId("54c905662d0a99627efe17a9"),
"avg": NumberInt(0),
"chunk_begin": ISODate("2015-01-28T12:00:00.0Z"),
"count": NumberInt(15),
"max": NumberInt(0),
"min": NumberInt(0),
"sum": NumberInt(0),
"tag": ObjectId("5326d2a61db62d7d2f8c13c0")
}
Как вы можете видеть его «_id» из первого набора данных совпадает с «тегом» со второго.
Я хочу написать подпрограмму в php, которая получает идентификаторы из первой коллекции и находит через них наборы данных в определенный таймфрейм во второй коллекции для удаления.
Я получаю идентификатор из первой коллекции ok, но я подозреваю, что неправильно использую его в запросе для второй коллекции, потому что ничего не найдено и не удаляется.
код выглядит следующим образом:
// select a collection (analog to a relational database's table)
$tagCollection = $db->tags;
$orderCollection = $db->orders;
// formulate AND query
$aTagCriteria = array(
'reporttype' => new MongoRegex('/[a-z]+/'),
);
// retrieve only _id keys
$fields = array('_id');
$cursor = $tagCollection->find($aTagCriteria, $fields);
$startOfTimeperiod = new MongoDate(strtotime('2015-01-05 00:00:00'));
$endOfTimeperiod = new MongoDate(strtotime('2015-01-07 13:20:00'));
// iterate through the result set
foreach ($cursor as $obj) {
echo '_id: '.$obj['_id'].' | ';
// Until here all is ok, I get the _id as output.
$aOrdercriteria = array(
'tag' => new MongoId($obj['_id']),
'date' => array(
'$lte' => $endOfTimeperiod,
'$gte' => $startOfTimeperiod
),
);
$iCount = $orderCollection->count($aOrdercriteria);
if ($iCount > 0) {
echo PHP_EOL.$iCount.' document(s) found.'.PHP_EOL;
$result = $orderCollection->remove($aOrdercriteria);
echo __FUNCTION__.'|'.__LINE__.' | '.json_encode($result).PHP_EOL;
echo 'Removed document with ID: '.$aOrdercriteria['tag'].PHP_EOL;
}
}
Что такое правильный путь для условия поиска, так это выглядит для тега объекты с ранее найденным идентификатором?
PS: Я попытался
'tag' => $obj['_id'],
вместо
'tag' => new MongoId($obj['_id']),
, который не работает.
Я не являюсь пользователем PHP, но подтверждаю ли вы, что _id является строкой? Некоторые драйверы автоматически преобразуют его в идентификатор объекта. – EmptyArsenal
var_dump ($ obj); Дает мне: массив (1) { [ "_id"] => объект (Mongoid) # 10 (1) { [ "$ ID"] => строка (24) "537c89d51db62d7d2fd1d37d" } } –
Как я понимаю, этот $ obj ['_ id'] должен быть объектом. –