2015-01-28 2 views
1

У меня есть база данных 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']), 

, который не работает.

+0

Я не являюсь пользователем PHP, но подтверждаю ли вы, что _id является строкой? Некоторые драйверы автоматически преобразуют его в идентификатор объекта. – EmptyArsenal

+0

var_dump ($ obj); Дает мне: массив (1) { [ "_id"] => объект (Mongoid) # 10 (1) { [ "$ ID"] => строка (24) "537c89d51db62d7d2fd1d37d" } } –

+0

Как я понимаю, этот $ obj ['_ id'] должен быть объектом. –

ответ

1

Так что две вещи нужно было изменить.

Первый был как EmptyArsenal намекнул:

tag' => new MongoId($obj['_id']), 

является ошибочным, так как $ OBJ [ '_ ID'] уже есть объект.

Так

'tag' => $obj['_id'], 

правильно. И если я изменю свое состояние с «date» на «chunk_begin» yahooo .... он работает. Глупый я.

Смежные вопросы