MongoDBでの高度なカウントクエリに問題があります。
ドキュメントフィールド内のオブジェクトをカウントしようとしていますが、クエリに一致する前の要素が存在し、配列内で 古い場合に限ります。
説明させてください…。
私はコンテナドキュメントを持っています、次のように見えます:
{
"_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、baz )のコンテナの数)。
しかし、今は、 barがfooよりも古い場合にのみfooとbarをカウントしたい(時間フィールドを使用)...オブジェクト1のコンテナーのカウント(foo)、オブジェクト1と2のコンテナーのカウント(fooとbar)、およびfoo.time <bar.timeオブジェクト1、2、および3(foo、bar、baz)を含むコンテナーのカウントAND 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を初めて使用しますが、それを効率的に行うためのベストプラクティスが何であるかは本当にわかりません。
よろしく!