У меня проблема с расширенным запросом подсчета с MongoDB.
Я пытаюсь подсчитать объект внутри поля документа, но только если предыдущий элемент, соответствующий запросу, существует и старше< /strong> в массиве.
Позволь мне объяснить....
У меня есть контейнерный документ, который выглядит так:
{
"_id" : ...,
[...]
"objects" : [ ]
}
Внутри полей объектов:
у меня есть документ объекта, который выглядит так:
[
{
"_id" : ...,
"name" : "foo",
"properties" = [ ],
"time" = 000000042
}
{
"_id" : ...,
"name" : "bar",
"properties" = [ ],
"time" = 000000424
}
{
"_id" : ...,
"name" : "baz",
"properties" = [ ],
"time" = 000004242
}
Сейчас я подсчитываю, сколько содержит документов-контейнеров:
количество контейнеров с объектом 1 (foo),
количество контейнеров с объектами 1 и 2 (foo и bar),
количество контейнеров с объектами 1, 2 и 3 (фу, бар, баз)
Но теперь я хочу считать foo и bar, только если bar старше, чем foo (используя поле времени)...
< strong>количество контейнеров с объектом 1 (foo),
количество контейнеров с объектами 1 и 2 (foo и bar), И foo.time ‹ bar.time
количество контейнеров с объектами 1, 2 и 3 (foo, bar , baz) И foo.time ‹ bar.time ‹ baz.time
Проблема в том, что поле времени должно меняться для каждого контейнера. Другими словами: как я могу использовать динамический запрос для каждого документа
вот пример кода:
foreach ($COUNTER[ARRAY_FIELDS_NAME_TO_COUNT] as $key => $value)
{
// Build the query (Name & properties)
$match[$key] = array('$elemMatch' => array('name' => $value['name']));
foreach ($value['properties'] as $propertyName => $propertyValue)
$match[$key]['$elemMatch']["properties.$propertyName"] = $propertyValue;
// Time checking
if ($key > 0)
{
//FIXME with a... dynamics query searching inside current doc??
// or a special var set to the previous object matched... or MapReduce..
}
// Make the query
$query = array('objects' => array('$all' => $match));
$result[$key]['count'] = $db->person->count($query);
}
Я новичок в MongoDB, и я действительно не знаю, как лучше всего сделать это эффективно!
С уважением!