我有一个有点复杂的查询,这对我的应用程序非常关键.
$cur = $col->find(
array (
'$or' => array(
array('owner' => $my_id),
array('owner' => array('$in' => $friends), 'perm.type' => array('$in' => array('P', 'F'))),
array('owner' => array('$in' => $friends), 'perm.list' => $my_id)
)
)
)->limit(10)->skip(0)->sort(array('ca' => -1));
Run Code Online (Sandbox Code Playgroud)
目的是找到前10个帖子,按照他们在desc顺序中的创建时间排序,这些帖子是:
一个).由我自己制作,或b).由我的朋友制作,允许类型为'P'供公众使用,或'F'供朋友使用,或c).由我的朋友制作,许可列表专门指定我作为观众.
变量$ friends是一组用户ID,他们是我的朋友.perm.type总共有4个值,分别是'P','F','S','C'.perm.list是一组有权查看此帖子的用户ID.
上述查询可用于过滤掉正确的结果.但是我遇到了在它们上创建有效索引的问题.
我为此查询创建的索引是:
$col->ensureIndex(array('owner' => 1, 'ca' => -1));
$col->ensureIndex(array('owner' => 1, 'perm.type' => 1, 'ca' => -1));
$col->ensureIndex(array('owner' => 1, 'perm.list' => 1, 'ca' => -1));
Run Code Online (Sandbox Code Playgroud)
第一个索引是针对查询条件的第一部分设计的,第二个索引是针对第二个条件设计的,第三个索引是针对第三个条件设计的,并且是多键索引.
一个典型的帖子看起来像这样:
{
"_id": "...",
"owner": "001",
"perm": {
"type": "P",
"list": []
}, …Run Code Online (Sandbox Code Playgroud)