我有一个查询,希望从1000万条记录中获取数据。现在,我在查询中使用$ lookup来从其他集合中获取数据,我只想对$ lookup成功执行的那些结果执行$ match,即$ lookup数组不为空。
下面是我到目前为止写的查询。
[
'$match'=>[
'$text'=>[
'$search'=>$query
]
]
],
[
'$lookup'=>[
'from'=>'library_books',
'localField'=>'_id',
'foreignField'=>'product_id',
'as'=>'library_data'
]
],
[
'$match'=>[
'library_data'=>[
'$exists'=>true,
'$not'=>[
'$size'=>0
]
]
]
],
[
'$unwind'=>'$library_data'
],
[
'$match'=>[
'library_data.library_id'=>$library_id,
'library_data.status'=>1
]
],
[
'$limit'=>5,
],
[
'$sort'=>[
'library_data.status'=>-1,
'library_data.out'=>1,
]
],
请注意,我已经使用
在其他集合上创建了索引
db.library_books.createIndex({library_id:1,status:1});
但是查询仍然需要3秒钟的时间来执行,因此有可能将查询时间进一步缩短到400ms左右。
答案 0 :(得分:1)
看起来索引应该在product_id
上。这就是您在library_books
集合中查找的字段。
db.library_books.createIndex( { product_id: 1 } );