Saya punya masalah dengan kueri penghitungan lanjutan dengan MongoDB.
Saya mencoba menghitung objek di dalam bidang dokumen, tetapi hanya jika elemen sebelumnya yang cocok dengan kueri ada dan lebih tua< /strong> dalam larik.
Biar saya jelaskan....
Saya mempunyai dokumen penampung, yang terlihat seperti:
{
"_id" : ...,
[...]
"objects" : [ ]
}
Di dalam bidang objek:
Saya memiliki dokumen objek yang terlihat seperti:
[
{
"_id" : ...,
"name" : "foo",
"properties" = [ ],
"time" = 000000042
}
{
"_id" : ...,
"name" : "bar",
"properties" = [ ],
"time" = 000000424
}
{
"_id" : ...,
"name" : "baz",
"properties" = [ ],
"time" = 000004242
}
Untuk saat ini saya menghitung berapa banyak dokumen penampung yang berisi:
jumlah penampung dengan objek 1 (foo),
jumlah kontainer dengan objek 1 dan 2 (foo dan bar),
jumlah kontainer dengan objek 1, 2 dan 3 (foo, bar, baz)
Namun sekarang saya ingin menghitung foo dan bar hanya jika bar lebih tua dari foo (menggunakan kolom waktu)...
< strong>count container dengan objek 1 (foo),
count container dengan objek 1 dan 2 (foo dan bar), AND foo.time ‹ bar.time
jumlah kontainer dengan objek 1, 2 dan 3 (foo, bar , baz) DAN foo.time ‹ bar.time ‹ baz.time
Masalahnya adalah bidang waktu perlu diubah untuk setiap kontainer. Dengan kata lain: Bagaimana saya bisa menggunakan kueri dinamis per dokumen
berikut contoh kodenya:
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);
}
Saya baru di MongoDB, dan saya benar-benar tidak tahu praktik terbaik apa yang bisa dilakukan untuk melakukannya secara efisien!
Salam!